FM33LC02X系列之【串口中断接收和轮询发送】

文章目录

  • 1.完整配置代码
    • 1.1 IO以及串口时钟配置
    • 1.2 串口中断配置
    • 1.3 使能串口接收中断
    • 1.4 实现串口中断处理程序
    • 1.5 实现串口轮询发送(打印printf调试功能实现)
  • 2.主函数测试函数

本文只描述串口0中断接收和轮询发送相关配置说明,其余相关请自行阅读datasheet或者度娘或者自行琢磨或者等我后面的文章,嘻嘻嘻~~

1.完整配置代码

完整初始化配置如下所示:

void Uartx_Init(UART_Type* UARTx)
{
     
    LL_GPIO_InitTypeDef GPIO_InitStruct = {
     0};
    LL_UART_InitTypeDef UART_InitStruct = {
     0};

    switch((uint32_t)UARTx)
    {
     
        case UART0_BASE: //debug
//            PA13:UART0-RX   PA14:UART0-TX
            GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14;
            GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
            GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
            GPIO_InitStruct.Pull = DISABLE;
            GPIO_InitStruct.RemapPin = DISABLE;
            LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
            
            UART_InitStruct.ClockSrc = LL_RCC_UART_OPERATION_CLOCK_SOURCE_APBCLK1;

            /*NVIC中断配置*/
            NVIC_DisableIRQ(UART0_IRQn);
            NVIC_SetPriority(UART0_IRQn,2);//中断优先级配置
            NVIC_EnableIRQ(UART0_IRQn);

            break;

        case UART1_BASE: //Speech Recognition
//            PB13:UART1-RX   PB14:UART1-TX
            GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14;
            GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
            GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
            GPIO_InitStruct.Pull = DISABLE;
            GPIO_InitStruct.RemapPin = DISABLE;			
            LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
            
            UART_InitStruct.ClockSrc = LL_RCC_UART_OPERATION_CLOCK_SOURCE_APBCLK1;
            break;

        case UART4_BASE:
//            PB2:UART4-RX   PB3:UART4-TX
            GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_3;
            GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
            GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
            GPIO_InitStruct.Pull = DISABLE;
            GPIO_InitStruct.RemapPin = DISABLE;			
            LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

//            PA0:UART4-RX   PA1:UART4-TX
            GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
            GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
            GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
            GPIO_InitStruct.Pull = DISABLE;
            GPIO_InitStruct.RemapPin = DISABLE;
            LL_GPIO_Init(GPIOA, &GPIO_InitStruct);	
            break;

        case UART5_BASE: // RGB led
//            PD0:UART5-RX   PD1:UART5-TX
            GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
            GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
            GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
            GPIO_InitStruct.Pull = DISABLE;
            GPIO_InitStruct.RemapPin = DISABLE;			
            LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
            break;

        default:
            break;
    }
    UART_InitStruct.BaudRate = 115200;
    UART_InitStruct.DataWidth = LL_UART_DATAWIDTH_8B;
    UART_InitStruct.StopBits = LL_UART_STOPBITS_1;
    UART_InitStruct.Parity = LL_UART_PARITY_EVEN;
    UART_InitStruct.TransferDirection = LL_UART_DIRECTION_TX_RX;
    UART_InitStruct.InfraredModulation = DISABLE;
    LL_UART_Init(UARTx, &UART_InitStruct);

//    ENABLE UART0 RECV TI
    LL_UART_DisableIT_ShiftBuffEmpty(UARTx);
    LL_UART_EnableIT_ReceiveBuffFull(UARTx);
}


void UART0_IRQHandler(void)
{
     
	uint8_t tmp08;
	//接收中断处理
	if((ENABLE == LL_UART_IsEnbaledIT_ReceiveBuffFull(UART0))
		&&(SET == LL_UART_IsActiveFlag_RXBF(UART0)))
	{
     
		LED0_ON();
		//中断转发接收到的数据
		/*tmp08 = */LL_UART_ReceiveData(UART0);//接收中断标志可通过读取rxreg寄存器清除
		//LL_UART_TransmitData(UART0, tmp08);
	}
	
/*	//发送中断处理
	if((ENABLE == LL_UART_IsEnbaledIT_ShiftBuffEmpty(UART0))
		&&(SET == LL_UART_IsActiveFlag_TXSE(UART0)))
	{
//		LED0_OFF();
		//发送中断标志可通过写txreg寄存器清除或txif写1清除
		//发送指定长度的数据
		if(UARTxOp.TxOpc < UARTxOp.TxLen)
		{
			LL_UART_TransmitData(UART0, UARTxOp.TxBuf[UARTxOp.TxOpc]); //发送一个数据
			UARTxOp.TxOpc++;
		}
		LL_UART_ClearFlag_TXSE(UART0);	//清除发送中断标志
	}
*/
}

#pragma import(__use_no_semihosting)
struct __FILE
{
     
    int handle;
};
FILE __stdout;

void _sys_exit(int x)
{
     
    x = x;
}

int fputc(int ch, FILE *f)
{
     
    UART0->TXBUF = ch;
    while (!(UART0->ISR & (0x1 << 0)));
    UART0->ISR |= (0x1 << 0);
    
    return ch;
}

PS:
这里注意下,在串口相关时钟使能情况下,配置串口收发需要清楚如下几点:

  1. 串口收发的IO口,即RX和TX的IO分别是多少并初始化配置IO模式;
  2. 串口中断配置并使能响应中断;
  3. 实现串口中断处理程序。

拆解如下:

1.1 IO以及串口时钟配置

//配置IO初始模式
GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14;
GPIO_InitStruct.Mode = LL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = DISABLE;
GPIO_InitStruct.RemapPin = DISABLE;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//配置串口时钟            
UART_InitStruct.ClockSrc = LL_RCC_UART_OPERATION_CLOCK_SOURCE_APBCLK1;

1.2 串口中断配置

/*NVIC中断配置并使能*/
NVIC_DisableIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn,2);//中断优先级配置
NVIC_EnableIRQ(UART0_IRQn);

1.3 使能串口接收中断

//    ENABLE UART0 RECV TI
LL_UART_DisableIT_ShiftBuffEmpty(UARTx);
LL_UART_EnableIT_ReceiveBuffFull(UARTx);

1.4 实现串口中断处理程序

void UART0_IRQHandler(void)
{
     
	uint8_t tmp08;
	//接收中断处理
	if((ENABLE == LL_UART_IsEnbaledIT_ReceiveBuffFull(UART0))
		&&(SET == LL_UART_IsActiveFlag_RXBF(UART0)))
	{
     
		LED0_ON();
		//中断转发接收到的数据
		/*tmp08 = */LL_UART_ReceiveData(UART0);//接收中断标志可通过读取rxreg寄存器清除
		//LL_UART_TransmitData(UART0, tmp08);
	}
}

1.5 实现串口轮询发送(打印printf调试功能实现)

这里注意,如果实现了轮询发送,就不要开启中断发送了,此处直接采用寄存器操作方式,前面的接收是用到库函数操作。

#pragma import(__use_no_semihosting)
struct __FILE
{
     
    int handle;
};
FILE __stdout;

void _sys_exit(int x)
{
     
    x = x;
}

int fputc(int ch, FILE *f)
{
     
    UART0->TXBUF = ch;
    while (!(UART0->ISR & (0x1 << 0)));
    UART0->ISR |= (0x1 << 0);
    
    return ch;
}

2.主函数测试函数

    while(1)
    {
     
        vTaskDelay(500);
        printf("Hello\r\n");
        LED1_TOG();
    }

你可能感兴趣的:(复旦微MCU,串口通信,uart,复旦微,FM33LC02X,单片机)