STM32f429串口
1. 发送是指从
单片机发送到
电脑。接收时单片机接收电脑数据,一切都是相对于单片机而言的
2. 寄存器
- 使能寄存器:串口的寄存器在APB2ENR和APB2ENR,串口1在在APB2ENR第四位。
- 波特率寄存器:不同的串口有不同的波特率寄存器,一般都在自己的USART_BRR。
- 串口控制:每个串口都有三个串口控制寄存器USART_CR1_1~3,

- OVER8 为过采样模式设置位, 我们一般设置位 0,即 16 倍过采样已获得更好的容错性。
- UE 为串口使能位,通过该位置 1,以使能串口。
- M 为字长选择位,当该位为 0 的时候设置串口为 8 个字长外加 n 个停止位,停止位的个数( n)是根据 USART_CR2 的[13:12]位设置来决定的,默认为 0。
- PCE 为校验使能位,设置为 0,则禁止校验,否则使能校验。
- PS 为校验位选择位,设置为 0 则为偶校验,否则为奇校验。
- TXIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_SR 中的 TXE 位为 1 时,将产生串口中断; TCIE 为发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC 位为 1时,将产生串口中断。
- RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_SR 中的 ORE 或者 RXNE 位为 1 时,将产生串口中断; TE 为发送使能位,设置为 1,将开启串口的发送功能。
- RE 为接收使能位,用法同 TE
- 数据发送与接收: STM32F429 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向 DR 寄存器写数据的时候,实际是写入 TDR,串口就会自动发送数据; 当收到数据, 读 DR 寄存器的时候,实际读取的是 RDR。 TDR 和 RDR对外是不可见的,所以我们操作的就只有 DR 寄存器
*

- DR[8:0]为串口数据,包含了发送或接收的数据。
- 由于它是由两个寄存器(TDR 和 RDR)组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。 TDR 寄存器提供了内部总线和输出移位寄存器之间的并行接口。 RDR 寄存器提供了输入移位寄存器和内部总线之间的并行接口。
- 串口状态:串口的状态可以通过状态寄存器 USART_SR 读取。

- RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
- TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式: 1)读 USART_SR,写USART_DR。 2)直接向该位写 0。
3. HAL库过程
void uart_init()
{
//UART 初始化设置
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=110250; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
}
//UART底层初始化,时钟使能,引脚配置,中断配置
//此函数会被HAL_UART_Init()调用
//huart:串口句柄
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)
//如果是串口1,进行串口1 MSP初始化
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
#if EN_USART1_RX
HAL_NVIC_EnableIRQ(USART1_IRQn);
//使能USART1中断通道
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
//抢占优先级3,子优先级3
#endif
}
}
/*HAL_UART_Init(&huart)通过句柄进行串口使能,
其中HAL_UART_MspInit函数是__week函数,应再次进行编写,
进行时钟使能,GPIO口使能,优先级选择 */
中断判断函数
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&UART1_Handler);
//调用 HAL 库中断处理公用函数
//中断处理完成后的结束工作
}
//HAL_UART_IRQHandler函数定义为进行判断中断类型,
选择调用哪个函数,以HAL_Receive_IT为例
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
//·····················
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
huart->ErrorCode = HAL_UART_ERROR_NONE;
//·····················
}
/*HAL_UART_Recieve_IT函数仅仅是判断中断,然后进入中断执行函数。
进入的时机由三个函数进行确定:
huart->pRxBuffPtr、huart->RxXferSize、huart->RxXferCount。
huart->pRxBuffPtr接收每次的数据,
huart->RxXferSize是接收字节的数量,
huart->RxXferCount是进行计数的变量,原本数据也是接收字节的数量,
但每接收一个字节就会减一,直至huart->RxXferCoun==0,
就会进入到中断执行函数。
总的来说就是接受完这次的数据后就会进入一次中断。
*/
中断执行函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//在这个函数里面写入中断执行函数
}
STM32f429串口
1. 发送是指从
单片机发送到
电脑。接收时单片机接收电脑数据,一切都是相对于单片机而言的
2. 寄存器
- 使能寄存器:串口的寄存器在APB2ENR和APB2ENR,串口1在在APB2ENR第四位。
- 波特率寄存器:不同的串口有不同的波特率寄存器,一般都在自己的USART_BRR。
- 串口控制:每个串口都有三个串口控制寄存器USART_CR1_1~3,

- OVER8 为过采样模式设置位, 我们一般设置位 0,即 16 倍过采样已获得更好的容错性。
- UE 为串口使能位,通过该位置 1,以使能串口。
- M 为字长选择位,当该位为 0 的时候设置串口为 8 个字长外加 n 个停止位,停止位的个数( n)是根据 USART_CR2 的[13:12]位设置来决定的,默认为 0。
- PCE 为校验使能位,设置为 0,则禁止校验,否则使能校验。
- PS 为校验位选择位,设置为 0 则为偶校验,否则为奇校验。
- TXIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_SR 中的 TXE 位为 1 时,将产生串口中断; TCIE 为发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC 位为 1时,将产生串口中断。
- RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_SR 中的 ORE 或者 RXNE 位为 1 时,将产生串口中断; TE 为发送使能位,设置为 1,将开启串口的发送功能。
- RE 为接收使能位,用法同 TE
- 数据发送与接收: STM32F429 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向 DR 寄存器写数据的时候,实际是写入 TDR,串口就会自动发送数据; 当收到数据, 读 DR 寄存器的时候,实际读取的是 RDR。 TDR 和 RDR对外是不可见的,所以我们操作的就只有 DR 寄存器
*

- DR[8:0]为串口数据,包含了发送或接收的数据。
- 由于它是由两个寄存器(TDR 和 RDR)组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。 TDR 寄存器提供了内部总线和输出移位寄存器之间的并行接口。 RDR 寄存器提供了输入移位寄存器和内部总线之间的并行接口。
- 串口状态:串口的状态可以通过状态寄存器 USART_SR 读取。

- RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
- TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式: 1)读 USART_SR,写USART_DR。 2)直接向该位写 0。
3. HAL库过程
void uart_init()
{
//UART 初始化设置
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=110250; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
}
//UART底层初始化,时钟使能,引脚配置,中断配置
//此函数会被HAL_UART_Init()调用
//huart:串口句柄
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)
//如果是串口1,进行串口1 MSP初始化
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
#if EN_USART1_RX
HAL_NVIC_EnableIRQ(USART1_IRQn);
//使能USART1中断通道
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
//抢占优先级3,子优先级3
#endif
}
}
/*HAL_UART_Init(&huart)通过句柄进行串口使能,
其中HAL_UART_MspInit函数是__week函数,应再次进行编写,
进行时钟使能,GPIO口使能,优先级选择 */
中断判断函数
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&UART1_Handler);
//调用 HAL 库中断处理公用函数
//中断处理完成后的结束工作
}
//HAL_UART_IRQHandler函数定义为进行判断中断类型,
选择调用哪个函数,以HAL_Receive_IT为例
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
//·····················
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
huart->ErrorCode = HAL_UART_ERROR_NONE;
//·····················
}
/*HAL_UART_Recieve_IT函数仅仅是判断中断,然后进入中断执行函数。
进入的时机由三个函数进行确定:
huart->pRxBuffPtr、huart->RxXferSize、huart->RxXferCount。
huart->pRxBuffPtr接收每次的数据,
huart->RxXferSize是接收字节的数量,
huart->RxXferCount是进行计数的变量,原本数据也是接收字节的数量,
但每接收一个字节就会减一,直至huart->RxXferCoun==0,
就会进入到中断执行函数。
总的来说就是接受完这次的数据后就会进入一次中断。
*/
中断执行函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//在这个函数里面写入中断执行函数
}
举报