头文件:
#ifndef UART_H
#define UART_H
/* Includes ------------------------------------------------------------------*/
#include "S32K144.h"
/* 宏定义 ---------------------------------------------------------------------*/
#define PCC_UART1_CLK_SRC ((uint32_t)0x01<<24) /* src = SOSCDIV2_CLK */
#define MY_LPUART_CTRL_RIE ((uint32_t)0x01<<21) /* RIE = 1 */
/* 函数声明 -------------------------------------------------------------------*/
void LPUART1_Init(void);
void IPUART1_transmit_char(int8_t send);
void LPUART1_trans_string(char data_string[]);
char LPUART1_receive_char(void);
void LPUART_recieve_and_echo_char(void);
#endif
/* ENDFILE ------------------------------------------------------------------*/
C文件:
/**
******************************************************************************
* @file uart.c
* @author ZY
* @version 0.0
* @date 2021.10.8
* @brief 串口发送接收数据功能
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "uart.h"
/**
* @brief LPUART1端口初始化
* @param void
* @reval void
*/
void LPUART1_PORT_Init(void)
{
PCC->PCCn[PCC_PORTC_INDEX] |= PCC_PCCn_CGC_MASK; /* 使能PORTC时钟 */
PORTC->PCR[6] |= (uint32_t)0x02<<8; /* PORTC6复用为LPUART1_RX */
PORTC->PCR[7] |= (uint32_t)0x02<<8; /* PORTC7复用为LPUART1_TX */
}
/**
* @brief LPUART初始化
* @param void
* @reval void
*/
void LPUART1_Init(void)
{
PCC->PCCn[PCC_LPUART1_INDEX] = ~PCC_PCCn_CGC_MASK; /* 关闭UART1时钟选通 */
PCC->PCCn[PCC_LPUART1_INDEX] |= PCC_UART1_CLK_SRC /* src = SOSCDIV2_CLK */
| PCC_PCCn_CGC_MASK; /* 使能UART1时钟 */
LPUART1->BAUD = 0x0E000034; /* 配置波特率为9600 1停止位 */
/* SBR=52 (0x34): baud divisor = 8M/9600/16 = ~52 */
/* OSR=15: 采样率 = 15+1 = 16 */
/* SBNS = 1:1个停止位 */
/* BOTHEDGE = 0:接收端使用波特率时钟上升沿采样输入数据 */
/* M10 = 0:接收机和发射机使用7位到9位的数据字符 */
/* RESYNCDIS = 0:支持在接收数据字期间重同步 */
/* LNKDIE,RXEDGIE:禁用LIN中断,RX收入边缘中断 */
/* TDMDAE,RDMAE = 0:关闭DMA请求 */
/* MAEN1,MAEN2,MATCFG = 0:关闭匹配 */
#if (LPUART1_RX_ITEN == 1)
LPUART1->CTRL = 0x000C0000 | MY_LPUART_CTRL_RIE;
#else
LPUART1->CTRL = 0x000C0000; /* Enable transmitter & receiver, no parity, 8 bit char: */
/* RE=1: Receiver enabled */
/* TE=1: Transmitter enabled */
/* M,M7,R8T9,R9T8 = 0:8个数据位 */
/* DOZEEN = 0:睡眠模式下LPUART正常使用 */
/* MA2IE,MA1IE,ILIE,RIE,TCIE,TLE,PEIE,FEIE,NEIE,ORIE = 0:关闭所有中断 */
/* TXINV=0:发送数据不是反向的 */
/* IDLECFG = 0:1个空闲位 */
/* ILT = 0:空闲字符在开始位后计数 */
#endif
}
/**
* @brief 中断优先级设置
* @param IRQn:中断索引号
* @param Priority:中断优先级
* @reval void
*/
void S32_NVIC_EableIRQ(IRQn_Type IRQn, uint8_t Priority)
{
S32_NVIC->ISER[(uint32_t)((uint32_t)IRQn>>5)] = (uint32_t)(0x01 << (((uint32_t)IRQn) & ((uint32_t)0x1F))); /* 使能对应中断 */
S32_NVIC->IP[IRQn] = (uint8_t)Priority<<4; /* 设置优先级 */
}
void LPUART1_Config(void)
{
LPUART1_PORT_Init();
LPUART1_Init();
#if (LPUART1_RX_ITEN == 1)
S32_NVIC_EableIRQ(LPUART1_RxTx_IRQn,1); /* 设置中断优先级 */
#endif
}
/**
* @brief LPUART发送字符
* @param send:待发送字符
* @reval void
*/
void IPUART1_transmit_char(int8_t send)
{
while(((LPUART1->STAT & LPUART_STAT_TDRE_MASK)>>LPUART_STAT_TDRE_SHIFT) == 0);
/* 等待数据寄存器为空 */
LPUART1->DATA = send; /* 发送数据 */
}
/**
* @brief LPUART发送字符串
* @param data_string[]:待发送字符串
* @reval void
*/
void LPUART1_trans_string(char data_string[])
{
uint32_t i;
while(data_string[i] != '\0'){
IPUART1_transmit_char(data_string[i]); /* 依次发送数据 */
i++;
}
}
/**
* @brief LPUART查询接收字符
* @param void
* @reval recieve:收到的字符
*/
char LPUART1_receive_char(void)
{
char recieve;
while(((LPUART1->STAT & LPUART_STAT_RDRF_MASK)>>LPUART_STAT_RDRF_SHIFT) == 0);
/* 等待接收寄存器非空 */
recieve = LPUART1->DATA; /* 读取数据 */
return recieve;
}
/**
* @brief 向上位机返回收到的字符
* @param void
* @reval void
*/
void LPUART_recieve_and_echo_char(void)
{
char send = LPUART1_receive_char(); /* 将收到字符返回 */
IPUART1_transmit_char(send);
IPUART1_transmit_char('\n'); /* 换行 */
IPUART1_transmit_char('\r'); /* 回车 */
}
int8_t recieve_mes;
void LPUART1_RxTx_IRQHandler(void)
{
if(((LPUART1->STAT & LPUART_STAT_RDRF_MASK)>>LPUART_STAT_RDRF_SHIFT) == 1) /* 判断是否为接收中断 */
{
recieve_mes = LPUART1->DATA; /* 读取数据 */
}
}
/* ENDFILE ------------------------------------------------------------------*/
main函数:
/**
******************************************************************************
* @file main.c
* @author ZY
* @version 0.0
* @date 2021.9.27
* @brief 实现时钟配置与IO配置,点亮LED
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "S32K144.h"
#include "clocks_and_modes.h"
#include "led.h"
#include "key.h"
#include "exit.h"
#include "uart.h"
/**
* @brief us延时函数
* @param delay_us:延时delay_us微秒
* @reval void
*/
void Dleay_us(uint32_t delay_us)
{
volatile uint32_t num;
volatile uint32_t t;
for(num = 0; num < delay_us; num++)
{
t = 11;
while(t){
t--;
}
}
}
/**
* @brief ms延时函数
* @param delay_ms:延时delay_ms毫秒
* @reval void
*/
void Dleay_ms(uint16_t delay_ms)
{
volatile uint32_t num;
for(num = 0; num < delay_ms; num++)
{
Dleay_us(1000);
}
}
int main(void)
{
My_Sysclock_Config(); /* 系统时钟配置 */
LPUART1_Init(); /* LPUART1初始化 */
while(1)
{
LPUART_recieve_and_echo_char(); /* 返回上位机数据 */
}
}