目录:

一、时钟使能,包括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) 来判断是否产生发送完成中断。

参考资料

关于串口的使用可以参考之前发表的几篇博文:

  1. STM32学习笔记(二)——串口控制LED
  2. STM32学习笔记(三)——外部中断的使用

以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

2017年4月18日21:42:36

欢迎大家关注我的个人博客
微信扫码关注我的公众号

不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

STM32学习笔记(四)——串口控制LED(中断方式)的更多相关文章

  1. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  2. STM32学习笔记——USART串口

    转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...

  3. STM32学习笔记——USART串口(向原子哥和火哥学习)

    一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...

  4. STM32学习笔记(三)——外部中断的使用

    开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...

  5. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  6. STM32学习笔记(四) RCC外设的学习和理解

    RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...

  7. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  8. STM32学习笔记之EXTI(外部中断)

    參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...

  9. STM32学习笔记:为什么使用外部中断要打开syscfg时钟?

    AFIO时钟只是在STM32F1系列里被提及. 对于32F1系列,涉及到管脚的EXTI. REMAP.事件输出时就需要开启AFIO时钟. 比方上面提到的管脚REMAP,必须先开AFIO时钟.配置EXT ...

随机推荐

  1. JAVA-FTP批量大文件传输

    FTP的具体使用      FTP是一种网络协议,用于进行不同服务器主机之间的文件传输,或者简单地说两台不同IP的机器之间的文件传输.在java中我们什么时候需要用到FTP文件传输呢?比如两台服务器的 ...

  2. F# 语法概览

    F#和C#的语法差别 语法上,F#和C#有两个主要差别: 用缩进而非花括号分隔代码块 用空白而非逗号分隔参数 F#常见语法元素 以下是F#代码中常见的语法元素 注释 // 这是单行注释 (* 这是多行 ...

  3. nodejs学习第一天之模块

    1.运行js文件 2.node 与 js 的区别 相同:数据类型,语法结构,对象  等基本一致 不同:在js中的顶层对象window 在node中没有在node中 顶层对象为global对象 其不对外 ...

  4. 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  5. iOS多线程——GCD

    最近的项目遇到了很多多线程的问题,借此机会对GCD进行了一番学习并总结.首先说一下什么是GCD,GCD全称 Grand Central Dispatch,是异步执行任务的技术之一.开发者只需要定义想要 ...

  6. 前端资讯周报 3.13 - 3.19: WebVR来了!以及如何优化scroll事件性能

    每周一我都会分享上一周我订阅的技术站点中,和解决问题的过程中阅读到的值得分享的文章.这是迫使我学习的一个动力 本周推荐 Minecraft in WebVR with HTML Using A-Fra ...

  7. iOS开发之数据存储之NSData

    1.概述 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象. NSDat ...

  8. signedCookies

    var express = require('../') , request = require('supertest') , cookieParser = require('cookie-parse ...

  9. Jmeter新建用例图示

    添加线程组   添加HTTP请求   编辑HTTP请求 添加HTTP信息头   编辑HTTP信息头 添加断言   添加查看结果树   添加聚合报告   添加响应时间   添加TPS   批量运行命令: ...

  10. 一个关于Python正则表达式的快速使用手册

    一直在纠结自己的博客到底应该写一些什么东西,这几天发现自己的正则用的不是很熟练,于是想要写一篇关于正则表达式的博客,目的就是为了让自己以后要用而又不会的时候不至于像无头苍蝇一样到处乱撞. 有些人在碰到 ...