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;//使能中断
}