STM32 USART的使用(基于库函数版本)
对中断需要用到的的默认的两个管脚PA9和PA10的模式进行设置.
* 注意:不要忘记RCC的设置!STM32的结构决定了用任何一个外设 * 就必须设置相应的使能时钟。USART1的使能时钟位是在APB2中的 * 本例中对应函数UART1_GPIO_Configuration()
* 2: 对USART的数据格式进行设置,即发送数据的数据位、校验位等.
* 本例对应函数为UART1_GPIO_Configuration()
* 注:对于数据是以上升沿还是下降沿有效,可以设置也可以不设 * 置,如果不设置,则系统采用默认值。本例中将其屏蔽。 * 3: 在主函数中调用以上两个函数,然后用库函数USART_SendData()
* 发送数据,用USART_GetFlagStatus(USART1, USART_FLAG_TXE) * 查询中断即可。
#include
void delay(u32 x) //延时函数,u32是库函数中定义好的宏,意为无符号32位整数 {
while(x--);}
/********************************************************************** * Name : UART1_GPIO_Configuration * Deion : Configures the uart1 GPIO ports. * Input : None * Output : None * Return : None
void UART1_GPIO_Configuration(void) //注意:不是库函数,而是自己定义的GPIO初始化函数,
{
GPIO_InitTypeDef GPIO_InitStructure;
//定义GPIO管脚初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//本函数(使能时钟)参数中,RCC_APB2Periph_USART1是必不可少的,有人会问,对于串口用到的PA9和
//PA10不用使能时钟吗?其实由于USART1默认的就是PA9和PA10,所以这一个就行了,当然你要是加上 //这个|RCC_APB2Periph_GPIOA也是不报错的,只是重复了。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//选中串口默认输出管脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//定义输出最大速率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //定义管脚9的模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用函数,把结构体参数输入进行初始化
// Configure USART1_Rx as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //同上
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置上浮模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
//同上
* Name : UART1_Configuration * Deion : Configures the uart1 * Input : None * Output : None * Return : None
*******************************************************************************/ void USART_Configuration(void) {
USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
/*USART_ClockInitTypeDef USART_ClockInitStructure;//定义串口模式初始化结构体
USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;// USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1,&USART_ClockInitStructure); */
USART_InitStructure.USART_BaudRate = 9600; //设置串口通信时的波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位的长度8个位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No //设置校验位“无”
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置硬件控制流失能(失能:就是不管用的意思。使能:就是让某个功能起作用。) USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置发送使能,接收使能 USART_Init(USART1, &USART_InitStructure);
//将以上赋完值的结构体带入库函数USART_Init进行初始化
USART_Cmd(USART1, ENABLE);//开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别
}
int main(void)
UART1_GPIO_Configuration(); //调用GPIO初始化函数 USART_Configuration(); //调用USART配置函数 while(1)
//大循环
{
USART_SendData(USART1, 'A'); //发送一位数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //判断是否发送完毕 delay(0XFFFFF); //延时
2100433B