芯海CS32G021uart串口中断模式收发

1.初始化串口配置

//---------------------------------------------------------------------
//      name  :   UARTconfig_Initial
//    function:
//     input  :   PA8  --- RXD
//    output  :   PA9  --- TXD
//---------------------------------------------------------------------
void UARTconfig_Initial(void)
{
	UART_InitTypeDef UART_InitStructure;
	
	//--------UART 脚位设置 ------------------------------
	GPIO_ModeConfig (GPIOA,GPIO_PinSource8,GPIO_Mode_IN);     //  PA8 -- RXD
	GPIO_PupdConfig (GPIOA,GPIO_PinSource8,GPIO_PuPd_DOWN); //
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_UART);     //  
	
	GPIO_ModeConfig (GPIOA,GPIO_PinSource9,GPIO_Mode_OUT_PP); //  PA9 -- TXD
	GPIO_PupdConfig (GPIOA,GPIO_PinSource9,GPIO_PuPd_NOPULL); //
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_UART);     //  

	//------- UART 时钟设置 ------------------------------
	RCC_APBPeriphClockCmd (RCC_APBPeriph_UART0, ENABLE);    //
	RCC_UARTCLKConfig(RCC_UARTCLK_HCLK,RCC_UARTDIV_2);      // 24M/2 = 12M
	
	//-------- UART 功能配置 ------------------------------
	UART_InitStructure.BaudRate  = 9600 ;
	UART_InitStructure.Parity    = UART_Parity_No;
	UART_InitStructure.Mode      = UART_Mode_Tx | UART_Mode_Rx ;
	UART_InitStructure.RXFIFOThreshold = 1 ;
	UART_InitStructure.TXFIFOThreshold = 1 ;
  
	UART_Init(&UART_InitStructure);
	//----------------------
	UART_IT_Enable();
    UART_Cmd (ENABLE);	
}	

2.打开中断使能模式

void UART_IT_Enable(void)
{
	UART_ClearFlag(UART_Flag_RNE| UART_Flag_TE);    //
	NVIC_IRQxEnable(IRQ_UART0);                     //
	UART_ITConfig (UART_IT_RNE, ENABLE);           //	
}	

3.实现收发代码部分

//串口收发中断
void UART_ISR(void)
{
                //串口收到数据
	if( UART_GetFlagStatus(UART_Flag_RNE))
		{
		UART_ClearFlag(UART_Flag_RNE);//清标志位
		urbuf[ReceDataLen] = UART_ReceiveData();
		if(ReceDataLen+1 < sizeof(urbuf)){ReceDataLen++;}//如没溢出就接收
		ReceTimeOver = SysClock;//用作判断多长时间没接收到字节用
		}
                //串口发送数据
	if(UART_GetFlagStatus(UART_Flag_TE))
		{
		UART_ClearFlag(UART_Flag_TE);//清标志位
		if(SendDataLen > 0)//待发长度
			{
			UART_SendData(*SendDataPrt++);
			SendDataLen--;
			}
		else{UART_ITConfig (UART_IT_TE, DISABLE);}//发完失能发送中断
		}
	
}	

备注:装载发送数据包

/***********************************************************
 * 功能: 通信数据包装
 * 输入: 命令,缓冲,长度,等待发送完毕
 * 返回: 无
***********************************************************/
void uart_send_packet(uint8_t cmd, uint8_t *buf, uint8_t len, uint8_t wait)
{
    utbuf[0] = COMM_HAND1;
    utbuf[1] = COMM_HAND2;
    utbuf[2] = cmd;
    utbuf[3] = 'U';
    utbuf[4] = len;
    mem_copy(buf,&utbuf[5],len);
    utbuf[utbuf[4]+5] = Crc8(utbuf,utbuf[4]+5);
	SendDataPrt = &utbuf[0];
	SendDataLen = len+6;
	UART_ITConfig (UART_IT_TE, ENABLE);//触发发送中断
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值