S32K144:3.串口实验

头文件:

#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(); /* 返回上位机数据 */
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值