[STM32F4] RS-232,USART的区别与STM32F407ZGT6 USART学习

[复制链接]
 楼主| c17 发表于 2022-12-31 19:50 | 显示全部楼层
STM32配置
1) 串口时钟和 GPIO 时钟使能。
串口是挂载在 APB2 下面的外设,所以使能函数为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
// 使能 USART1 时钟  
GPIO 时钟使能,就非常简单,因为我们使用的是串口 1 ,串口 1 对应着芯片引脚 PA9,PA10
因此使能GPIOA时钟就OK
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能 GPIOA 时钟
 楼主| c17 发表于 2022-12-31 19:51 | 显示全部楼层
设置引脚复用器映射
  1. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9 复用为 USART1
  2. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10 复用为 USART1
  3. 因为串口使用到 PA9,PA10,所以我们要把 PA9 和 PA10 都映射到串口 1。所以这里我们要调用
  4. 两次函数。
复制代码
 楼主| c17 发表于 2022-12-31 19:52 | 显示全部楼层
GPIO 端口模式设置: PA9 和 PA10 要设置为复用功能。
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPIOA10
  2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  3. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
  4. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  5. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  6. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10
复制代码
 楼主| c17 发表于 2022-12-31 19:55 | 显示全部楼层
串口参数初始化:设置波特率,字长,奇偶校验等参数
串口初始化是调用函数 USART_Init 来实现的,具体设置方法如下:
 楼主| c17 发表于 2022-12-31 19:57 | 显示全部楼层
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;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
 楼主| c17 发表于 2022-12-31 19:57 | 显示全部楼层
使能串口
USART_Cmd(USART1, ENABLE); //使能串口
 楼主| c17 发表于 2022-12-31 19:58 | 显示全部楼层
串口数据发送与接收。
  STM32F4 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包
含了 TDR 和 RDR 。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也
是存在该寄存器内。
  STM32 库函数操作 USART_DR 寄存器发送数据的函数是:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
 楼主| c17 发表于 2022-12-31 19:59 | 显示全部楼层
开启中断并且初始化 NVIC,使能相应中断
  这一步如果我们要开启串口中断才需要配置 NVIC 中断优先级分组。通过调用函数
NVIC_Init 来设置。简而言之就是配置中断都要在NVIC 里配置,
 楼主| c17 发表于 2022-12-31 19:59 | 显示全部楼层
  1. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  2. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 3
  3. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级 3
  4. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
  5. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器、
  6. //同时,我们还需要使能相应中断,使能串口中断的函数是:
  7. void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState);
  8. //开启中断的方法是:
  9. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断
  10. //发送完成)要产生中断,那么方法是:
  11. USART_ITConfig(USART1,USART_IT_TC,ENABLE);
  12. //系统的中断优先级分组,我们是在我们 main 函数开头设置的,代码如下:
  13. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2
复制代码
 楼主| c17 发表于 2022-12-31 20:02 | 显示全部楼层
获取相应中断状态
当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是:
USART_GetITStatus(USART1, USART_IT_TC);//返回值是 SET,说明是串口发送完成中断发生
 楼主| c17 发表于 2022-12-31 20:03 | 显示全部楼层
中断服务函数
当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的
逻辑代码即可。简单理解中断函数就是类似于条件函数if()满足中断条件就执行相应的中断函数,同时通过优先级安排依次处理多种中断,串口 1 中断服务函数为:

void USART1_IRQHandler(void) ;
Bowclad 发表于 2023-1-1 16:20 | 显示全部楼层
电脑的串口就是RS232
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部