新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2019-7-31
- 在线时间
- 4 小时
|
1金钱
/*
* @Author : SYM
* @Date : 2020-04-07 17:59:50
* @LastEditors : SYM
* @LastEditTime : 2020-04-08 17:31:07
* @FilePath : /13_uart/bsp/uart/bsp_uart.c
* @Notes :
*/
#include "bsp_uart.h"
//#include "bsp_gpio.h"
/**
* @description: 初始化uart1 ,波特率固定为115200
* @param void
* @return: void
*/
void uart_init(void)
{
/*初始化UART1的IO*/
uart_io_init();
/*初始化UART1*/
//关闭UART
uart_disable(UART1);
uart_softreset(UART1);
/*配置UART1*/
UART1->UCR1 = 0;//清0
UART1->UCR1 &= ~(1<<14);
/*设置UART1 数据位、奇偶校验、停止位*/
UART1->UCR2 = 0; //这里清0后。下面的bit6 .bit7,bit8就不用置0了
UART1->UCR2 |= (1<<1) | (1<<2) | (1<<5) | (1<<14); //bit14置1是RTS不需要
UART1->UCR3 |=(1<<2);//该位必须为1
/*设置波特率115200*/
UART1->UFCR &= ~(7<<7); //对RFDIV清0
UART1->UFCR = (5<<7); //设置为1分频 ,所以进入80MHZ
//根据公式凑出来的
UART1->UBIR = 71;
UART1->UBMR = 3124;
/*使能串口*/
uart_enable(UART1);
}
/**
* @description: 初始化uart1-io口
* @param void
* @return: void
*/
void uart_io_init(void)
{
/*复用为GPIO1_IO016-RX 17-TX*/
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_RX,0);
/*设置GPIO_IO016、17电气属性*/
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_RX,0x10B0);
}
/*
* @description : 波特率计算公式,
* 可以用此函数计算出指定串口对应的UFCR,
* UBIR和UBMR这三个寄存器的值
* @param - base : 要计算的串口。
* @param - baudrate : 要使用的波特率。
* @param - srcclock_hz :串口时钟源频率,单位Hz
* @return : 无
*/
/**
* @description: 关闭UART
* @param - base : 要关闭的串口。
* @return:
*/
void uart_disable(UART_Type *base)
{
base->UCR1 &= ~(1<<0);//清0
}
/**
* @description: 打开UART
* @param - base : 要打开的串口。
* @return:
*/
void uart_enable(UART_Type *base)
{
base->UCR1 |= (1<<0);//置1
}
/* 软复位UART */
void uart_softreset(UART_Type *base)
{
base->UCR2 &= ~(1 << 0);//清0
while((base->UCR2 & 0X1) == 0); //取bit0位并判断是否为0
}
/* 通过UART1发送一个字符 */
void putc(unsigned char c)
{
while(((UART1->USR2 >> 3 ) & 0X01) == 0);//取USR2 bit3位然后与0x1判断是否为0,1表示发送完成,
UART1->UTXD = c; //要发送什么字符就向UTXD写入什么字符
}
/* 通过串口接收数据 返回值为unsigned char */
unsigned char getc(void)
{
while(((UART1->USR2) & 0X01) == 0); /* 等待有数据可以读取 */
return UART1->URXD; //接收到的数据都在URXD寄存器上。
}
/* 通过串口发送一串字符 */
void puts(char *str)
{
char *p = str;
while(*p)
putc(*p++);
}
/*
* @Author : SYM
* @Date : 2020-03-27 02:06:49
* @LastEditors : SYM
* @LastEditTime : 2020-04-08 17:34:32
* @FilePath : /13_uart/project/main.c
*/
#include "main.h"
#include "bsp_clk.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_exti.h"
#include "bsp_epit.h"
#include "bsp_keyfilter.h"
#include "bsp_uart.h"
int main(void)
{
unsigned char led_state = OFF;
unsigned char a =0;
/*中断初始化函数*/
int_init();
/*使能外设时钟*/
imx6u_clkinit();
clk_enable();
/*延时初始化*/
delay_init();
/* 初始化LED */
led_init();
/*初始化蜂鸣器*/
beep_init();
/*初始化按键*/
key_init();
/* 初始化按键中断 */
//exti_init();
/* 初始化EPIT1中断, 周期为500ms */
//epit_init(0,66000000/2);
/*初始化按键消抖定时器*/
//keyfilter_init();
/*初始化串口*/
uart_init();
//死循环,默认系统在里面运行
while(1)
{
//delay_ms(500);
puts("请输入1个字符:");
a = getc();
putc(a);//回显
puts("\r\n");
puts("你输入的字符为:");
putc(a);
puts("\r\n");
led_state =!led_state;
led_switch(LED0,led_state);
}
return 0;
}
|
|