LCP1768及stm32f串口中断接收

1 篇文章 0 订阅
1 篇文章 0 订阅

LPC1768系列
串口初始化,要设置两个结构体参数,一个是gpio,一个是uart的设置

/************************************************************************************************
函数名:void uart_config2(uint32_t Baud_rate)
函数功能:串口2初始化管脚配置
参数:波特率
返回值:无
*************************************************************************************************/
void uart_config2(uint32_t Baud_rate){
	
	UART_CFG_Type UARTConfigStruct;
	PINSEL_CFG_Type PinCfg;

	PinCfg.Funcnum = 1;//设置管脚功能为串口功能
	PinCfg.Portnum = 0;//设置管脚端口号,GPIO0
	PinCfg.Pinnum = 10;//GPIO0_10
	PINSEL_ConfigPin(&PinCfg);
	PinCfg.Pinnum = 11;//GPIO0_11
	PINSEL_ConfigPin(&PinCfg);//初始化结构体
	UART_ConfigStructInit(&UARTConfigStruct);//对结构体参数赋初值

	UARTConfigStruct.Baud_rate = Baud_rate;//设置波特率
	UARTConfigStruct.Databits=UART_DATABIT_8;//设置数据8位
	UARTConfigStruct.Parity=UART_PARITY_NONE;//无校验
	UARTConfigStruct.Stopbits=UART_STOPBIT_1;//设置停止位1位
	UART_Init(LPC_UART2, &UARTConfigStruct);//初始化结构体
	UART_TxCmd(LPC_UART2, ENABLE);  //使能发送
}

串口重定向

int fputc(int ch, FILE *f)
{      
	while((LPC_UART0->LSR & 0x20)==0);//循环发送,直到THR为空  
    LPC_UART0->THR  = (u8) ch;      
	return ch;
}

中断服务函数

/*******************************************************************************************************
* 函数介绍 串口中断
* 参数:无
* 返回值:无
* 备注:无
********************************************************************************************************/
void UART0_IRQHandler()
{
	uint32_t intsrc,tmp;
	uint8_t dat;
	intsrc = LPC_UART0->IIR;//获取UART终端标识寄存器的值
	tmp = intsrc & UART_IIR_INTID_MASK;//只获取[3:1]三位的状态值,
	if (tmp == UART_IIR_INTID_RDA)//如果是接收数据可用状态,则对接收数据进行处理
	{
		dat = UART_ReceiveByte(LPC_UART0);
		if(!recvFinish)//初值为0,接收完成标志位
		{
			if(recvBegin)//初值为0,接收开始标志位,进入此语句内说明帧头符合
			{
				recvBuf[recvCnt++] = dat;
				if(recvCnt==64)//数据的帧定长接收完成
				{
					recvBegin = 0;//停止对接收数据进行处理
					recvFinish = 1;//接收完成标志位
				}
			}
			else if(dat==0XAA)//数据的帧头
			{
				recvCnt = 0;//缓存器计数从0开始
				recvBuf[recvCnt++] = dat;//放入数据进缓存
			}
			else if(dat==0X55&&recvCnt==1)//数据的帧头
			{
				recvBuf[recvCnt++] = dat;//放入数据进缓存
				recvBegin = 1;//数据的帧头符合
			}	
		}
	}
}

这个语句是串口中断模式接送定长数据

STM32系列

  • 主函数main.c加入
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//开启接收中断
  • 开启接收中断,没接收8位数据,进入一次中断
  • 在中断处理函数中,没有使用HAL库的处理函数及回调函数,应用于固定帧头的定长数据接收
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
	static uint8_t rec_num=0;
	uint8_t dat;
	
	if(USART2->SR&0x20)//接收中断
	{
//		USART2->SR &=~0x20;//清除中断,可以省去,读DR位的时候,会自动清零
		dat=USART2->DR;
		if(uart2_recok_flag==0)
		{
			if(rec_begin)
			{
				rec_buf[rec_num++]=dat;
				if(rec_num==8)
				{
					uart2_recok_flag=1;
					rec_begin=0;
				}
			}
			else if(dat==0xaa)
			{
				rec_num=0;
				rec_buf[rec_num++]=dat;
			}
			else if(dat==0x55&&rec_num==1)
			{
				rec_buf[rec_num++]=dat;
				rec_begin=1;
			}
		}
	}
  /* USER CODE END USART2_IRQn 0 */
//  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

2021.11.20
在调试LPC1768单片机的时候,电路使用了uart1串口,和其他的串口功能稍有不同,标准固件库的初始化有区别

void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct)
{
	uint32_t tmp;

	// For debug mode
	CHECK_PARAM(PARAM_UARTx(UARTx));
	CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits));
	CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits));
	CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity));

#ifdef _UART0
	if(UARTx == (LPC_UART_TypeDef *)LPC_UART0)
	{
		/* Set up clock and power for UART module */
		CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, ENABLE);
	}
#endif

#ifdef _UART1
	if(((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
	{
		/* Set up clock and power for UART module */
		CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, ENABLE);
	}
#endif
......

正确的初始化应该为

void communication1Init(void)
{
	PINSEL_CFG_Type PinCfg;
	UART_CFG_Type UARTConfigStruct;
	UART_FIFO_CFG_Type UARTFIFOConfigStruct;
		
	//串口0 TXD--P0.15 RXD--P0.16 引脚第2功能
	PinCfg.Portnum = 0;//端口
	PinCfg.Pinnum = 15;//引脚
	PinCfg.Funcnum = 1;//功能
	PinCfg.Pinmode = 0;//模式
	PinCfg.OpenDrain = 0;//开漏
	PINSEL_ConfigPin(&PinCfg);
	PinCfg.Pinnum = 16;//引脚
	PINSEL_ConfigPin(&PinCfg);
		
	UARTConfigStruct.Baud_rate = 38400;
	UARTConfigStruct.Databits = UART_DATABIT_8;//8数据位
	UARTConfigStruct.Parity = UART_PARITY_NONE;//无校验
	UARTConfigStruct.Stopbits = UART_STOPBIT_1;//1停止位
	UART_Init((LPC_UART_TypeDef*)LPC_UART1, &UARTConfigStruct);
		
	UART_FIFOConfigStructInit(&UARTFIFOConfigStruct);
	UART_FIFOConfig((LPC_UART_TypeDef*)LPC_UART1, &UARTFIFOConfigStruct);
	UART_TxCmd((LPC_UART_TypeDef*)LPC_UART1, ENABLE);
	
	UART_IntConfig((LPC_UART_TypeDef*)LPC_UART1, UART_INTCFG_RBR, ENABLE);
	NVIC_SetPriorityGrouping(0X05);
	NVIC_SetPriority(UART1_IRQn, ((0x01<<3)|0x100));
	NVIC_EnableIRQ(UART1_IRQn);
}

LPC_UART1前面需要加类型转换,当是由于使用不当,编译报错,最终使用了寄存器直接配置

void tcp_com_Init(void)
{
	/*P0.15---TXD     
		P0.16---RXD*/
	uint16_t usFdiv;
	LPC_PINCON->PINSEL0|=(1<<30);
	LPC_PINCON->PINSEL1|=(1<<0);
	LPC_PINCON->PINMODE_OD0|=(3<<15);
	LPC_SC->PCONP |=0x10;
	LPC_UART1->LCR=0x83;
	usFdiv = (SystemCoreClock/4/16) / 38400; 
	LPC_UART1->DLM=usFdiv / 256;
	LPC_UART1->DLL=usFdiv % 256;
	LPC_UART1->LCR=0X03;
	LPC_UART1->FCR=0X07;
	
	NVIC_EnableIRQ(UART1_IRQn);
	LPC_UART1->IER=UART_IER_RBRINT_EN;//使能中断
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值