目录:
一,时钟使能,包括 GPIO 的时钟和串口的时钟使能
二,设置引脚复用映射
三,GPIO 的初始化配置,注意要设置为复用模式
四,串口参数初始化配置
五,中断分组和中断优先级配置
六,设置串口中断类型并使能串口中断
七,编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号).
八,主函数的实现.
一,时钟使能,包括 GPIO 的时钟和串口的时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能串口时钟
二,设置引脚复用映射
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);,
三,GPIO 的初始化配置,注意要设置为复用模式
/*GPIO 配置 */
IO_Init.GPIO_Mode = GPIO_Mode_AF; // 配置成复用模式
IO_Init.GPIO_OType = GPIO_OType_PP;
IO_Init.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
IO_Init.GPIO_PuPd = GPIO_PuPd_UP;
IO_Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &IO_Init);
四,串口参数初始化配置
/* 串口初始配置 */
UT_Init.USART_BaudRate = 9600; // 波特率
UT_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件控制流
UT_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 发送接收
UT_Init.USART_Parity = USART_Parity_No; // 无奇偶校验
UT_Init.USART_StopBits = USART_StopBits_1; // 停止位 1
UT_Init.USART_WordLength = USART_WordLength_8b; // 数据位 8
USART_Init(USART1, &UT_Init);
五,中断分组和中断优先级配置
/* 中断优先级设置,中断分组 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 2NC_Init.NVIC_IRQChannel=USART1_IRQn;// 串口 1 中断通道 NC_Init.NVIC_IRQChannelCmd=ENABLE;// 使能中断 NC_Init.NVIC_IRQChannelPreemptionPriority=0;// 抢占优先级 NC_Init.NVIC_IRQChannelSubPriority=0;// 响应优先级 NVIC_Init(&NC_Init);
六,设置串口中断类型并使能串口中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);// 配置串口中断类型,接收数据中断 USART_Cmd(USART1, ENABLE);
七,编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号).
voidUSART1_IRQHandler(void) // 串口 1 中断服务程序
{
u8 Receive_Data = 0;
if (USART_GetITStatus(USART1, USART_IT_RXNE)) // 由于只设置了一种接收中断,判断可以省略
{
Receive_Data = USART_ReceiveData(USART1); // 保存接收到的数据, RXNE 自动清零 printf("Receive Succsed: %2x \r\n", Receive_Data);// 回复接收完成
if (Receive_Data == 0x01) LED0 = !LED0;
// USART_ClearFlag(USART1,USART_IT_RXNE); // 手动清零
}
}
由于本程序只使能串口接收到数据(USART_IT_RXNE)产生中断,所以在执行中断服务函数之前可以不用判断,如果使能了多种串口中断,则要先判断产生中断的类型,注意读取数据后,RXNE 寄存器自动清零,不需要再手动清零.
八,主函数的实现,这里仍然采用了 LED 闪烁和串口发送数据来显示程序运行状态的方法.
intmain(void)
{
LED_Init();
delay_init(168);
USART1_Config();
LED0_OFF;
LED1_OFF;
while(1)
{
LED1=!LED1;
printf("Running....\r\n");
delay_ms(500);
}
}
以上工作做好后,就可以将程序下载到 STM32 了, 可以发现 LED1 在闪烁,同时串口发送来了 running..... 当电脑发送一个 0x01 时 LED0 的状态会反转.
总结
本程序只使用了串口接收完成后产生中断,如果我们要让数据发送完成后产生中断,应该如何配置呢?方法是类似的,中断配置时只需要设置为 USART_ITConfig(USART1, USART_IT_TC, ENABLE); 同样可以通过函数 USART_GetITStatus(USART1, USART_IT_TC) 来判断是否产生发送完成中断.
参考资料
STM32F4xx 中文参考手册
STM32F4 开发指南 - 库函数版本_V1.1
USART_百度百科
关于串口的使用可以参考之前发表的几篇博文:
STM32 学习笔记(二)--串口控制 LED
STM32 学习笔记(三)--外部中断的使用
以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正.
2017 年 4 月 18 日 21:42:36
STM32 学习笔记(四)--串口控制 LED(中断方式)
来源: http://www.bubuko.com/infodetail-2031340.html