打印
[其他ST产品]

STM32的AFIO时钟什么时候需要开启

[复制链接]
5521|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


        STM32F407最多可以提供6路串口;USART1 和 USART2 和 USART3;
1. 串口相关介绍及使用
1.1 串口设置的一般步骤:

1. 串口时钟使能,GPIO时钟使能;

2. 设置引脚复用器映射:调用GPIO_PinAFConfig();函数;

3. GPIO初始化设置:设置模式为复用功能;

4. 串口参数初始化:设置波特率,字长,奇偶检验等参数;        

5. 开启中断并且初始化NVIC,使能中断(需要开启中断时才会存在该步骤);

6. 使能串口;

7. 编写中断处理函数:函数名格式为USARTxIRQHandler();(x为对应的串口号,STM32F407的x取值为1 2 3 );注意区别51的中断命名格式;

8. 串口数据收发:void USART_SendData();  //发送数据到串口,本质是调用串口数据寄存器 DR

                             uint16_t USART_ReceiveData();   //接受数据,从 DR 读取接收到的数据

9. 串口传输状态获取:FlagStatus USART_GetFlagStatus();

                                    void USART_ClearITPendingBit();   //清除中断标志位

使用特权

评论回复
沙发
自动化陈稳|  楼主 | 2023-5-27 13:08 | 只看该作者
1.1.1 串口时钟和GPIO时钟使能

串口使能函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 (x取1);

GPIO时钟使能:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
1.1.2 设置引脚复用器映射

引脚复用的意思就是说:STM32F407功能太多,引脚不够每个分配单独的功能,所以通过GPIO_PinAFConfig函数定义xx引脚复用另外的功能;

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10复用为USART1

GPIO_PinAFConfig函数的参数是:GPIO口,对应的引脚,复用的串口;注意:我们要把PA9、PA10都映射到串口1,我们要调用两次函数;

使用特权

评论回复
板凳
自动化陈稳|  楼主 | 2023-5-27 13:08 | 只看该作者
1.1.3 GPIO端口模式设置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   //复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 、

使用特权

评论回复
地板
自动化陈稳|  楼主 | 2023-5-27 13:08 | 只看该作者
1.1.4 串口参数初始化

串口参数初始化和GPIO初始化基本一致:调用各自的初始化结构体函数即可;

USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 :所谓停止位实际上是一个时间长度。时间长度和串口通信的波特率有关,通信所用波特率的倒数即为一位,他在实际中表示为一个时间段;

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位:奇偶检验位是一个表示给定位数的二进制数中1的个数是奇数还是偶数的二进制数;如果一组给定数据位中1的个数是奇数,偶检验位就置1,从而使得1的个数为偶数;反之也是;在串行通信中,奇偶校验位通常是由UART这样的接口硬件生成、校验的,在接收方,通过接口硬件中的寄存器的状态位传给CPU以及操作系统。

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 串口硬件流设置

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式 :串口通信的两种模式TXD和RXD;

USART_Init(USART1, &USART_InitStructure); //初始化串口

使用特权

评论回复
5
自动化陈稳|  楼主 | 2023-5-27 13:09 | 只看该作者
1.1.5 开启中断并且初始化NVIC,使能中断

如果需要开启中断就需要配置中断优先级NVIC;调用函数:NVIC_Init;

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  // NVIC中断优先级通道选择为 串口通道

NVIC_InitStructure.NVIC_IRQChannelPremptionPriority=3; // 抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  // 响应优先级(也就是子优先级)3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  // IRQ通道使能

NVIC_Init(&NVIC_InitStructure);  // 根据指定的参数初始化VIC寄存器

使能相应串口中断:void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) ;注意:这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种;

如果需要开启中断,那么我们在系统初始化的时候就需要设置系统的中断优先级分组(main函数开头设置)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 ;2位抢占优先级,2位响应优先级;

使用特权

评论回复
6
自动化陈稳|  楼主 | 2023-5-27 13:09 | 只看该作者
1.1.6 使能串口

使能串口调用函数USART_Cmd来实现;

USART_Cmd(USART1, ENABLE); //使能串口
1.1.7 串口数据发送与接收

STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,双寄存器,包括TDR和RDR。当写数据时,串口自动发送;收到数据以后,数据也是保存在该寄存器中;

操作USART_DR寄存器发送数据函数:void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

操作USART_DR寄存器读取收到数据的函数:uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

使用特权

评论回复
7
自动化陈稳|  楼主 | 2023-5-27 13:09 | 只看该作者
1.1.8 串口状态

串口的状态通过状态寄存器USART_SR读取;

寄存器USART_SR:RXNE位(读数据寄存器非空):当寄存器的该位置1时,提示有数据接收到了,并且可以通过USART_DR寄存器进行读取;可以通过USART_DR将该位清0,也可以直接向该位写0;TC(发送完成):该位被置位时,表示USART_DR数据已经被发送完成了 ,可以通过USART_DR将该位清0,也可以直接向该位写0;

读取串口状态的函数:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及TC(发送完成)。

ag. USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

      USART_GetFlagStatus(USART1, USART_FLAG_TC);

使用特权

评论回复
8
自动化陈稳|  楼主 | 2023-5-27 13:09 | 只看该作者
1.1.9 获取中断状态

在中断过程中,判断中断是哪种中断,使用的函数是:ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) ;

ag. 判断是否是串口发送完成中断:USART_GetITStatus(USART1, USART_IT_TC) ;返回值SET,表明发送完成中断发生;

使用特权

评论回复
9
自动化陈稳|  楼主 | 2023-5-27 13:09 | 只看该作者
1.1.10 中断服务函数

当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可   void USART1_IRQHandler(void);

使用特权

评论回复
10
自动化陈稳|  楼主 | 2023-5-27 13:15 | 只看该作者
2. 通信接口背景知识
2.1 处理器和外部设备通信的两种方式:

①:并行通信:

数据的各个位同时传输;因为是各个位同时传输的,所以传输的速度比较快。一次性的将8个位同时传输。

各个位同时传输,每个位都需要占用STM32的一个引脚,所以占用的引脚比较多。

使用特权

评论回复
11
自动化陈稳|  楼主 | 2023-5-27 13:15 | 只看该作者


②:串行通信:

数据按位顺序进行传输;因为是按照位的顺序进行传输的,所以传输速度相对较慢。按顺序来传输,就不再需要每一位都占用一个引脚,所以占用的引脚相对较少。

使用特权

评论回复
12
自动化陈稳|  楼主 | 2023-5-27 13:15 | 只看该作者

使用特权

评论回复
13
自动化陈稳|  楼主 | 2023-5-27 13:15 | 只看该作者
2.2 串行通信_单工_半双工_全双工

串行通信按照数据传送方向分为:单工、半双工、全双工

单工:数据传输只支持数据在一个方向上传输。

半双工:允许数据在两个方向上传输。但是同一时刻不允许数据同时在两个方向上传输。简单来说,就是一方向的传输正在进行,不允许另一方向的传输同时进行。实际上是一种切换方向的单工通信。

全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

使用特权

评论回复
14
自动化陈稳|  楼主 | 2023-5-27 13:16 | 只看该作者

使用特权

评论回复
15
自动化陈稳|  楼主 | 2023-5-27 13:17 | 只看该作者
2.3 同步通信和异步通信

同步通信和异步通信都属于串行通信的通信方式。

同步通信:带时钟同步信号传输。比如:SPI、IIC协议

同步通信前,通信的双方必须建立同步,需要借助时钟,设置双方的时钟达到同一频率。字符是可以一个接着一个传输,但是每组信息(也称为信息帧)的开始要加上同步字符,在没有信息传输时,需要加上空字符,因为同步通信是不允许有间隙的。

发送一位是按照时钟来发送的,时钟上升沿,发送一位;下一个时钟上升沿,我再发送一位。

使用特权

评论回复
16
自动化陈稳|  楼主 | 2023-5-27 13:17 | 只看该作者
异步通信:不带时钟同步信号。比如:UART(通用异步收发器)、单总线协议

异步通信中两个数据字符之间的传输间隔可以是任意的,不需要传输时钟。但是在异步通信方式中,发送和接收的双方必须约定相同的帧格式,否则会造成传输错误。

异步通信不需要时钟,通信双方约定好通信速率(波特率)、起始位、终点位、高电平1占的时间、低电平0占的时间等。就像51单片机中的单总线协议一样,高电平1这样定义:一个电位中电平占2/3记为高电平1,电平占1/3记为低电平0;

同步和异步是按照通信双方发送和接收的时钟来确定的;同一时钟下发,对应同一时钟下收,就是同步通信,反之就是异步通信;为了保证收发的同步,需要时钟的参与。

使用特权

评论回复
17
自动化陈稳|  楼主 | 2023-5-27 13:18 | 只看该作者
2.4 常见的串行通信接口

UART(通用异步收发器):

        TXD:发送端;

        RXD:接收端;

        GND:公共端;

        通信方式:异步通信;

        通信方向:全双工;

单总线(one-wire):

        DQ:发送/接收端;

        通信方式:异步通信;

        通信方向:半双工;

SPI:

        SCK:同步时钟;

        MISO:主机输入,从机输出;

        MOSI:主机输出,从机输入;

        通信方式:同步通信;

        通信方向:全双工;

I2C:

        SCL:同步时钟;

        SDA:数据输入/输出端;

        通信方式:同步通信;

        通信方向:半双工;

STM32的串行通信接口:UART---通用异步收发器;USART---通用同步异步收发器;STM32F407一般是6个;

使用特权

评论回复
18
自动化陈稳|  楼主 | 2023-5-27 13:18 | 只看该作者
2.5 STM32串口通信的特点

1. 全双工异步通信

2. 小数波特率发生器系统,提供精确的波特率

3. 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能

(过采样:采样频率高于信号最高频率的两倍,称过采样。)

4. 可编程的数据字长度(8位或者9位)

5. 可配置的停止位(支持1或者2位停止位)

6. 可配置的使用DMA多缓冲器通信

7. 单独的发送器和接收器使能位

8. 检测标志:①接收缓冲器 ②发送缓冲器空 ③传输结束标志

9. 多个带标志的中断源。触发中断

10. 其他:校验控制,四个错误检测标志

使用特权

评论回复
19
自动化陈稳|  楼主 | 2023-5-27 13:18 | 只看该作者
2.6 STM32通信过程



首先UART是串行发送,所以是按照双方约定的波特率进行一位一位的接收发送;RXD接收过程,MCU内核接收外设一位一位传来的数据到移位寄存器,移位寄存器存放满之后同时发送到缓冲寄存器,然后被MCU内核所接收;

数据发送的过程同样如此,MCU内核将所要发送的数据发送给数据缓冲器,数据缓冲器同时将数据发送给移位寄存器,移位寄存器一位一位的将数据发送给外设。

使用特权

评论回复
20
自动化陈稳|  楼主 | 2023-5-27 13:19 | 只看该作者
2.7 STM32串口异步通信需要定义的参数

①起始位  ---通信双方约定好的起始位,比方说,双方通信前都是高电平1,设置起始位为低电平0,设定一旦遇到0双方就开始通信。

②数据位(8位或者9位)

③奇偶校验位(第9位)  ---8位+1位(奇偶校验位)  ; 奇偶校验位的意思就是:如果设定为奇校验,如果8位中1的个数为偶数,则第九位补1,否则补0;

                                                                                                                       如果是偶校验,8位中1的个数是奇数,则第九位补1,否则补0;

奇偶校验的区分就是1的个数为奇数还是偶数;

④停止位(1,15,2位)  ---传输的最后一位是停止位;停止位以后就开始下一个起始位;

⑤波特率设置  ---传输的效率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1200

帖子

1

粉丝