发新帖我要提问
12
返回列表
打印
[STM32F4]

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

[复制链接]
楼主: c17
手机看帖
扫描二维码
随时随地手机跟帖
21
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 时钟

使用特权

评论回复
22
c17|  楼主 | 2022-12-31 19:51 | 只看该作者
设置引脚复用器映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9 复用为 USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10 复用为 USART1
因为串口使用到 PA9,PA10,所以我们要把 PA9 和 PA10 都映射到串口 1。所以这里我们要调用
两次函数。

使用特权

评论回复
23
c17|  楼主 | 2022-12-31 19:52 | 只看该作者
GPIO 端口模式设置: PA9 和 PA10 要设置为复用功能。
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

使用特权

评论回复
24
c17|  楼主 | 2022-12-31 19:55 | 只看该作者
串口参数初始化:设置波特率,字长,奇偶校验等参数
串口初始化是调用函数 USART_Init 来实现的,具体设置方法如下:

使用特权

评论回复
25
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); //初始化串口

使用特权

评论回复
26
c17|  楼主 | 2022-12-31 19:57 | 只看该作者
使能串口
USART_Cmd(USART1, ENABLE); //使能串口

使用特权

评论回复
27
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);

使用特权

评论回复
28
c17|  楼主 | 2022-12-31 19:59 | 只看该作者
开启中断并且初始化 NVIC,使能相应中断
  这一步如果我们要开启串口中断才需要配置 NVIC 中断优先级分组。通过调用函数
NVIC_Init 来设置。简而言之就是配置中断都要在NVIC 里配置,

使用特权

评论回复
29
c17|  楼主 | 2022-12-31 19:59 | 只看该作者
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=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);
//开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断
//发送完成)要产生中断,那么方法是:
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
//系统的中断优先级分组,我们是在我们 main 函数开头设置的,代码如下:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2

使用特权

评论回复
30
c17|  楼主 | 2022-12-31 20:02 | 只看该作者
获取相应中断状态
当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是:
USART_GetITStatus(USART1, USART_IT_TC);//返回值是 SET,说明是串口发送完成中断发生

使用特权

评论回复
31
c17|  楼主 | 2022-12-31 20:03 | 只看该作者
中断服务函数
当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的
逻辑代码即可。简单理解中断函数就是类似于条件函数if()满足中断条件就执行相应的中断函数,同时通过优先级安排依次处理多种中断,串口 1 中断服务函数为:

void USART1_IRQHandler(void) ;

使用特权

评论回复
32
Bowclad| | 2023-1-1 16:20 | 只看该作者
电脑的串口就是RS232

使用特权

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

本版积分规则