STM32学习笔记(四)——串口控制LED(中断方式)
目录:
一、时钟使能,包括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); //中断优先级分组2
NC_Init.NVIC_IRQChannel=USART1_IRQn; //串口1中断通道
NC_Init.NVIC_IRQChannelCmd=ENABLE; //使能中断
NC_Init.NVIC_IRQChannelPreemptionPriority=; //抢占优先级
NC_Init.NVIC_IRQChannelSubPriority=; //响应优先级
NVIC_Init(&NC_Init);
六、设置串口中断类型并使能串口中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置串口中断类型,接收数据中断
USART_Cmd(USART1, ENABLE);
七、编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号)。
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Receive_Data = ;
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闪烁和串口发送数据来显示程序运行状态的方法。
int main(void)
{
LED_Init();
delay_init();
USART1_Config();
LED0_OFF;
LED1_OFF;
while()
{
LED1=!LED1;
printf("Running....\r\n");
delay_ms();
}
}
以上工作做好后,就可以将程序下载到STM32了, 可以发现LED1在闪烁,同时串口发送来了running.....当电脑发送一个0x01时LED0的状态会反转。
总结
本程序只使用了串口接收完成后产生中断,如果我们要让数据发送完成后产生中断,应该如何配置呢?方法是类似的,中断配置时只需要设置为USART_ITConfig(USART1, USART_IT_TC, ENABLE); 同样可以通过函数USART_GetITStatus(USART1, USART_IT_TC) 来判断是否产生发送完成中断。
参考资料
STM32F4xx中文参考手册
STM32F4开发指南-库函数版本_V1.1
USART_百度百科
关于串口的使用可以参考之前发表的几篇博文:
以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。
2017年4月18日21:42:36
欢迎大家关注我的个人博客
微信扫码关注我的公众号
不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!
STM32学习笔记(四)——串口控制LED(中断方式)的更多相关文章
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32学习笔记——USART串口
转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...
- STM32学习笔记——USART串口(向原子哥和火哥学习)
一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...
- STM32学习笔记(三)——外部中断的使用
开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...
- stm32学习笔记之串口通信
在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...
- STM32学习笔记(四) RCC外设的学习和理解
RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- STM32学习笔记之EXTI(外部中断)
參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...
- STM32学习笔记:为什么使用外部中断要打开syscfg时钟?
AFIO时钟只是在STM32F1系列里被提及. 对于32F1系列,涉及到管脚的EXTI. REMAP.事件输出时就需要开启AFIO时钟. 比方上面提到的管脚REMAP,必须先开AFIO时钟.配置EXT ...
随机推荐
- 从数组中每次取一个不同的数组成员 getRandomItem(arr)
积累些常用的方法, 都是随写的, 不好之处, 望指出. getRandomItem(arr)函数如下: var getRandomItem = function () { var preItem = ...
- Node.js + React + MongoDB 实现 TodoList 单页应用
之前用 Ant Design 开发了一个项目,因此对 React 的特性有了一定的了解,React 使用封装组件的思想,组件各自维护自己的状态和 UI, 组件之间通过 props 传递数据和方法.当状 ...
- 有关rip路由协议相关知识以及实例配置【第1部分】
有关rip路由协议相关知识以及实例配置[第一部分] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从 ...
- 用javascript实现base64编码器
前面的话 base-64作为常见的编码函数,在基本认证.摘要认证以及一些HTTP扩展中得到了大量应用.在前端领域,也常常把图片转换为base-64编码在网络中传输.本文将详细介绍base64的原理及用 ...
- Button颜色选择器进阶
drawable/button_color.xml <?xml version="1.0" encoding="utf-8"?> <selec ...
- 关于Tarjan(1)
众所周知, 求有向图的强连通分量的Tarjan算法是以其发明者Robert Tarjan命名的.Robert Tarjan还发明了求双连通分量的Tarjan算法,以及求最近公共祖先(LCA)的离线Ta ...
- 那些"不务正业"的IT培训公司
前言 大四下期了,现在准备找一份Java开发的实习工作,于是在各大网站上投递简历-智联招聘.51job.拉勾网,慧眼识真金的我必然会把培训机构给过滤掉,对于重庆来说招聘实习的公司少之又少,然而是智联招 ...
- 面试 -- ListView对其指定的子Item进行单独的刷新
1,最近在面试题目的时候突然看到了问题"ListView对其指定的子Item进行单独的刷新",当时感觉一脸懵逼,还是第一次听到这个问题,也就是不能使用adapter.notifyD ...
- SQL AlawaysOn 之五:ISCSI共享磁盘
用于存放SQL数据库 1.安装服务 2.安装完成后要求重启计算机.添加该功能要配置计算机,如果是正式服务器,那种不能关机太久的服务器,请慎用. 重启之后看到文件和储存服务,击击进去 3.看到ISCSI ...
- python安装paramiko需要的依赖
yum install gcc libffi-devel python-devel openssl-devel -y