S32K148-uart
不好意思,上个星期因为项目和个人原因,落下一次博客分享。最近一直在搞上位机,之前用的CAN通讯做的上位机,现在因为项目原因换成modbus-rtu,所以就跟大家说说关于modbus协议中用到的uart口。
uart学名通用异步收发器
硬件不做阐述
软件通信协议重点关注几个方面:空闲位,起始位,数据位,奇偶校验位,停止位,波特率
S32K148配置过程
1)引脚配置,注意uart模块使能(专家系统自动给外设时钟使能)

2)uart配置


初始化代码:
uint8_t UART0_bufferIdx;
uint32_t UART0_bytesRemaining;
uint8_t UART0_ReceiveBuffer[200];
void UART0_init(void) { LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0); LPUART_DRV_InstallRxCallback(INST_LPUART1, UART0_Callback, (void *)0); LPUART_DRV_ReceiveData(INST_LPUART1, UART0_ReceiveBuffer, 1); }
uart回调函数
void UART0_Callback(void *driverState, uart_event_t event, void *userData) { (void) driverState; (void) userData; status_t state; state = LPUART_DRV_GetReceiveStatus(INST_LPUART1, &UART0_bytesRemaining); /*等待传输完成*/ // while(state == STATUS_BUSY); if (state != STATUS_BUSY) if(state == STATUS_SUCCESS) { /*字符串附加终止符*/ UART0_bufferIdx++; UART0_ReceiveBuffer[UART0_bufferIdx] = 0U; //接收缓存数据复制到Databuffer //memcpy(Databuffer,ReceiveBuffer,bufferIdx); UART0_bufferIdx = 0; /*重新接收数据*/ LPUART_DRV_ReceiveData(INST_LPUART1, UART0_ReceiveBuffer, 1); } else { //可做其他逻辑判断 } /*接收缓存FULL*/ if (event == UART_EVENT_RX_FULL) { if ((UART0_ReceiveBuffer[UART0_bufferIdx] != '\n') && (UART0_bufferIdx != (BUFFER_SIZE - 2U))) { /*每接收一字节数据,就将储存位置指向数组的下一位,直到接收到换行符 */ UART0_bufferIdx++; LPUART_DRV_SetRxBuffer(INST_LPUART1, &UART0_ReceiveBuffer[UART0_bufferIdx], 1U); } } }

浙公网安备 33010602011771号