串口通信初始化
//配置串口的工作参数
void usart_initliuxin(uint32_t baudrate){
liuxin.Instance = USART1;
liuxin.Init.BaudRate = baudrate;
liuxin.Init.WordLength = UART_WORDLENGTH_8B;
liuxin.Init.StopBits = UART_STOPBITS_1;
liuxin.Init.Mode = UART_MODE_TX_RX;
liuxin.Init.Parity = UART_PARITY_NONE;
liuxin.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&liuxin);
HAL_UART_Receive_IT(&liuxin,(uint8_t*)g_rx_buffer,2);
}
首先是串口初始化
我们先创建函数方法 usart_init();
随后 我们首先调用HAL_UART_INIT()方法 然后发现他需要一个结构体指针
那么我们就开始创建 这个结构体
liuxin.Instance = USART1;//第一步 初始化是哪一个串口
liuxin.Init.BaudRate = baudrate;//设置波特率
//默认
liuxin.Init.WordLength = UART_WORDLENGTH_8B;
liuxin.Init.StopBits = UART_STOPBITS_1;
liuxin.Init.Parity = UART_PARITY_NONE;
liuxin.Init.HwFlowCtl = UART_HWCONTROL_NONE;
//默认
其实就设置两个参数 一个是 初始化某一个串口 还有就是设置波特率 其他都是默认的
最后调用最关键的代码
HAL_UART_Init(&liuxin);
至此 初始化完成一半
串口的gpio部分初始化
void HAL_UART_MspInit( UART_HandleTypeDef *huart)
首先我们需要在函数体中判断 huart是不是我们的串口1
if(huart->Instance ==USART1)
随后在if体里面开始初始化
我们观看手册
我们需要初始化GPIOA 对应的 9 10 端口
那么首先确认初始GPIO函数
HAL_GPIO_Init(GPIOA,&d);
rx对应的是接受的端口 tx对应发送
所有我们初始化pin9 首先创建初始化GPIO的结构体指针
d.Pin = GPIO_PIN_9;
d.Speed = GPIO_SPEED_FREQ_HIGH ;
最重要的就是确认mode
我们是发送端口 那么肯定就是 输出了 问题是选择哪一个输出呢 首先我们肯定是复用
- 复用功能:GPIO引脚不仅用于普通的I/O操作,还能复用为外设的功能,比如UART、SPI、I2C等。
- 推挽输出:能够驱动引脚输出高电平或低电平。
所以我们采用复用推挽输出
输入这很简单呢 普通的复用输入就行了 唯一注意的是 我们采用的是上拉 因为电平默认是高电平
d.Mode = GPIO_MODE_AF_INPUT;
d.Pin = GPIO_PIN_10;
d.Pull = GPIO_PULLUP;
最后 我们就要初始化两个很重要的事情
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_NVIC_SetPriority(USART1_IRQn,1,1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
上初始化时钟以及设置中断
随后去找到对应的中断函数
我们拷贝过来并且进行一些操作
void USART1_IRQHandler(){
HAL_UART_IRQHandler(&liuxin);
HAL_UART_Receive_IT(&liuxin,(uint8_t*)g_rx_buffer,2);
}
第二个函数是很重要的一步 她负责接受串口中的数据
其次 我们在每次打断后都需要接受他 并且重新设置
最后 重新写这个函数即可 设置
主函数的这个 transmit则是发送数据到串口