STM32F407串口通信基本内容

通信网络

624人已加入

描述

基本内容

使用F4进行串口通信需要相关的配置。由于没带双头USB线,我采用串口3搭配CC2541蓝牙&WiFi模块进行透传串口开发。

根据资料所示,我需要进行下面几个步骤:

  1. 串口时钟使能,GPIO时钟使能
  2. 设置引脚复用器映射
  3. GPIO参数初始化,设置复用
  4. 串口参数初始化,设置波特率,字长,奇偶校验等
  5. 开启中断,初始化NVIC并使能
  6. 使能串口
  7. 编写中断处理函数
  8. 串口发送AT指令设置CC2541模块透传

接着才能利用串口透传来调试。不过考虑到函数复用和避免日后重复造轮子的情况发生,我还是单独写成GPIO和串口的配置函数。因此我的流程如下:

  1. 初始化GPIO,时钟使能,设置引脚复用映射,设置模式等并使能
  2. 初始化串口,设置波特率,字长,奇偶校验等并使能串口
  3. 开启中断,初始化NVIC。使能中断
  4. 编写中断处理函数。

初始化GPIO

本次使用的是串口3,涉及的GPIO是PB10和PB11.因此首先要设置这两个GPIO。

使能时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

设置引脚复用器映射:

GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);

分别复用了B10和B11。

接着初始化。具体代码在下文查看。

点亮LED(库函数

GPIO_Mode处需要设置复用功能GPIO_Mode_AF,速度50MHZ即可,GPIO_OType设置推挽复用以得到更强的输出能力GPIO_OType_PP,电平选择上拉。选择上拉是因为根据串口定义,TX和RX在空闲状态保持1。

初始化串口

首先用F4库函数提供的结构体声明:

USART_InitTypeDef USART_InitStructure;

接着使能时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

需要注意的是,根据芯片手册,串口1,6是挂在APB2上的,而2,3,4,5都是挂载在APB1上的,因此初始化时应当使用RCC_APB1函数而不是跟之前一样用APB2。

然后设置各项相关参数:

led灯

APB和AHB时钟总线(未完成

由于只影响到GPIO和串口的初始化,此处不过多占用篇幅。

这俩是什么玩意?网上查得如下:

AHB(Advanced High-performance Bus), 高速总线,用来接高速外设的。APB (Advanced Peripheral Bus) 低速总线,用来接入低速外设。

其实AHB总线非常简单。里面一个仲裁器(Arbiter)用于仲裁多个主设备同时访问总线的情况,三个多路选择器,用于选通master与slave之间的data和address。另外ADDR没有分读和写的ADDR,也就是说AHB不是全双工,读写是不可以同时进行的。所以性能上比AXI一般来讲要弱一些。

对于APB来说,就简单多了。主要用来读写寄存器。

主要包含

led灯

VScode代码提示也可以看出,APB下挂载了GPIO:

led灯

AHB也可以使用:

led灯

NVIC初始化

NVIC是什么?

嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;

有什么功能?

先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。

次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。

NVIC就是控制上述功能的控制器

NVIC初始化

led灯

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分