本帖最后由 刘十九 于 2022-7-14 14:20 编辑
以下附上源码,求各位大佬解答
void Usart_Init(void)
{
rcu_periph_clock_enable(RCU_AF); // 使能 AF 时钟
rcu_periph_clock_enable(RCU_GPIOD); // 使能 GPIO 时钟
rcu_periph_clock_enable(RCU_USART1); // 使能串口时钟
gpio_pin_remap_config(GPIO_USART1_REMAP,ENABLE); // 重映射 USART1 管脚
// 引脚初始化:推挽输出, 速度50MHz, PD5 TX
gpio_init(USART1_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART1_TX);
// 引脚初始化:浮空输入, 速度50MHz, PD6, RX
gpio_init(USART1_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART1_RX);
// 串口配置
usart_deinit(USART1); // 复用 USART1
nvic_irq_enable(USART1_IRQn, 0, 0); // 配置中断优先级
usart_baudrate_set(USART1, 9600); // 波特率设置
usart_word_length_set(USART1, USART_WL_8BIT); // 8位数据位
usart_stop_bit_set(USART1, USART_STB_1BIT); // 1位停止位
usart_parity_config(USART1, USART_PM_NONE); // 无校验位
// usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE); // 配置RTS硬件控制流
// usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE); // 配置CTS硬件控制流
usart_receive_config(USART1, USART_RECEIVE_ENABLE); // 配置 USART1 接收
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); // 配置 USART1 发送
usart_enable(USART1); // 使能 USART1
usart_interrupt_enable(USART1, USART_INT_RBNE); // 使能 读缓冲区非空中断和溢出错误中断
}
/*
函数:串口中断函数
*/
void USART1_IRQHandler(void)
{
uint8_t res;
// 判断接收中断是否产生
if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
{
usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); // 清除标志位
res = (uint8_t)usart_data_receive(USART1); // 读取数据
// 判断是否溢出
if(ReadCount < USART_READ_BUF_SIZE)
{
ReadBuf[ReadCount++ = res;
}
timeout_flag = 160;
}
// 判断发送中断是否产生
if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE))
{
static uint8_t i = 0; // 发送数据下标
usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE); // 清除标志位
if(datalen > 0)
{
usart_data_transmit(USART1, SendBuf[i++);
datalen--;
}
else if(datalen == 0)
{
usart_interrupt_disable(USART1, USART_INT_TBE);
i = 0;
}
}
}
|