首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对USART1进行参数配置
下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式、波特率用户可以自定的串口:
/************************************************************************************************** * 硬件平台:STM32F103VC * 学习重点:调用库函数来实现对USART的操作 * 实现功能:软件仿真,实现STM32通过USART1发送数据 * 作 者:赵小龙 **************************************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。 #include "stm32f10x_map.h" /*----------------函数声明部分---------------*/ void delay1ms(int t) ; void RCC_Configuration(void) ; void GPIO_Configuration(void) ; void USART_Configuration(u32 BaudRate) ; /* Private functions -----------------------------------------------------------------------------*/ /************************************************************************************************** * Function Name : main * Description : 软件仿真,从USART1发送26个大写的英文字母 * Input : None * Output : None * Return : None ****************************************************************************************************/ int main(void) { u8 i,data; /*--------配置开启系统时钟、配置USART1发送/接收使用的两个I/O口、配置USART1---------------------------------------------*/ RCC_Configuration(); GPIO_Configuration(); USART_Configuration(19600); /*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/ data=‘A‘; for(i=0;i<26;i++) { USART_SendData(USART1, data) ; data++ ; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;//发送完成标志位为1时便是数据发送完毕,若为0时则应让程序等待(等待数据发送发送完成) /*注意:这里最好不要按照以下形式书写,否则会出错,具体原因我暂且还不知道 u8 status ; status = USART_GetFlagStatus(USART1, USART_FLAG_TC) ; //将查看状态寄存器的函数的返回值赋值给变量status while(status == RESET) ; */ } } /******************************************************************************* * Function Name : Delay_Ms * Description : delay 1 ms. * Input : dly (ms) * Output : None * Return : None *******************************************************************************/ void delay1ms(int t) { //机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us int temp = 6000/4 ; while(t--) { while(temp--) { ; } } } /******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { //----------使用外部RC晶振----------- RCC_DeInit(); //初始化为缺省值 RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪 //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer //FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ RCC_PLLCmd(ENABLE); //Enable PLLCLK while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source //---------打开相应外设时钟-------------------- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能APB2外设的GPIOC的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); } /******************************************************************************* * Function Name : GPIO_Configuration * Description : 初始化GPIO外设 * Input : None * Output : None * Return : None *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure USARTx_Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USARTx_Rx as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } /******************************************************************************* * Function Name : USART_Configuration * Description : 初始化串口USART1(异步收发模式) * Input : BaudRate (要设置的波特率) * Output : None * Return : None *******************************************************************************/ void USART_Configuration(u32 BaudRate) { //1、定义一个用于初始化USART的结构体 USART_InitTypeDef USART_InitStructure; //2、给结构体元素赋值,设置 波特率、数据帧的位数、停止位的位数、奇偶校验位、硬件流控制位、USART模式(发送、接收) USART_InitStructure.USART_BaudRate = BaudRate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //3、调用函数USART_Init();用上面的结构体值作为参数对USART1进行初始化 USART_Init(USART1, &USART_InitStructure); //4、调用函数USART_Cmd();对USART1进行使能 USART_Cmd(USART1, ENABLE); }
程序运行后:
STM32通过调用库函数进行编程,布布扣,bubuko.com
原文:http://blog.csdn.net/dragon12345666/article/details/24924217