文章转载请注明来源  作者:Zeroer

一、选择IO

想要使用硬件的UART必须先确定要mapping的pin脚

注意:用作TX的脚位可以分时复用成单线双工

因为芯片默认的调试串口用的是UART0,所以我们在做功能的时候使用UART1和UART2可以不用重新banding我们的调试接口

首先选择好我们的脚位后,对我们的IO进行初始化,我们以UART2的PB1、PB2为例

GPIOBDE  |= (BIT(2) | BIT(1));    //As Digital IO
GPIOBPU |= (BIT(2) | BIT(1));    //pull-up 10K
GPIOBDIR &= ~BIT(2);          //output
GPIOBDIR |= BIT(1);           //input
GPIOBFEN |= (BIT(2) | BIT(1));    //set function io

因为UART是属于我们的功能io,所以在初始化的时候需要将io配置为功能io,且一个脚同时只能有一个功能

二、配置IO映射

接下来对我们的IO映射到我们的UART功能上

FUNCMCON1 = (0xff<<4);         //Clear mapping
//two line mode
FUNCMCON1 = ((0x2<<4)|(0x2<<8)); //Map to Group 2
//single mode
FUNCMCON1 = ((0x2<<4)|(0x3<<8));   //Map to Group 2 and map RX pin by TX pin

↑↑↑这个是UART2的map寄存器以及占位

FUNCMCON0 = (0xff<<24);         //Clear mapping
//two line mode
FUNCMCON0 = ((0x2<<24)|(0x2<<28)); //Map to Group 2
//single mode
FUNCMCON0 = ((0x2<<24)|(0x3<<28)); //Map to Group 2 and map RX pin by TX pin

↑↑↑这个是UART1的map寄存器以及占位

FUNCMCON0 = (0xff<<8);         //Clear mapping
//two line mode
FUNCMCON0 = ((0x2<<8)|(0x2<<12)); //Map to Group 2
//single mode
FUNCMCON0 = ((0x2<<8)|(0x3<<12)); //Map to Group 2 and map RX pin by TX pin

↑↑↑这个是UART0的map寄存器以及占位

选择我们使用的寄存器通道以及单线或者双线模式

三、UART参数配置

继续对UART功能进行配置,先对我们UART的参数进行设置

UART2CON = 0;
UART2CON |= (BIT(5)|BIT(7)|BIT(2));

我们选择打开了Rx的中断接收,然后将时钟源切换到uart的独立时钟,然后我们对时钟进行设置

CLKCON1 |= BIT(14);    //select 26M div2
CLKGAT1 |= BIT(11); //clk enble
u32 baud = (26000000 / 2 + 115200 / 2) / 115200 - 1; //baud: 115200
UART2BAUD = ((baud<<16) | baud);

最后配置完所有的东西后,我们打开我们的UART,然后注册我们的中断函数

UART2CON |= BIT(0);
sys_irq_init(IRQ_UART_VECTOR, 0, uart2_isr_func);

这时候我们需要提供一个名为uart2_isr_func(也可以任意命名)的函数处理中断

u8 data = 0;

AT(.com_text.isr)
void uart2_isr_func(void)
{
if (UART2CON & BIT(9)){
UART2CPND |= BIT(9);
data = UART2DATA;
}
}

中断函数必须要用AT宏放到ram区域去,接下来我们写一个发送函数就完成了

void uart2_send(char *data, u8 len)
{
for(int i=0; i<len; i++)
{
while(!(UART2CON & BIT(8)));
UART2DATA = data[i];
}
}

四、总结

如果我们需要使用到UART0,我们就需要给调试接口重新写一个UART然后通过binding将print通过UART输出。

void my_printf_init(void (*putchar)(char));

最后我将完整的代码贴在后面提供给大家测试调试,会和前面的代码有一些差异,但是功能是一样的

char recv_buf[128];
u8 recv_len = 0;
AT(.com_rodata.isr)
const char ptr_t3[] = "RX:%lx\n";
AT(.com_rodata.isr)
const char ptr_r3[] = "TX:%lx\n";
AT(.com_text.isr)
void uart2_isr_func(void) //FIQ
{
if (UART2CON & BIT(9)){
UART2CPND |= BIT(9);
if (recv_len < 128) {
recv_buf[recv_len] = UART2DATA;
recv_len++;
} else {
memset(recv_buf, 0, sizeof(recv_buf));
recv_len = 0;
}
}
} void uart2_send(char *data, u8 len)
{
printf(ptr_r3,data[0]);
for(int i=0; i<len; i++)
{
while(!(UART2CON & BIT(8)));
UART2DATA = data[i];
}
}
#define BAUD_UART2 ((26000000/2+2000000/2)/2000000-1)
void uart2_init(void)
{
printf("%s\n",__func__); GPIOBDE |= (BIT(2) | BIT(1));
GPIOBPU |= (BIT(2) | BIT(1));
GPIOBDIR &= ~BIT(2);
GPIOBDIR |= BIT(1);
GPIOBFEN |= (BIT(2) | BIT(1)); FUNCMCON1 = (0xff<<4);
FUNCMCON1 = ((0x02<<4)|(0x02<<8)); UART2CON = 0;
UART2CON |= (BIT(5)|BIT(7)|BIT(2)); CLKCON1 |= BIT(14);
CLKGAT1 |= BIT(11); UART2BAUD = ((BAUD_UART2<<16) | BAUD_UART2); UART2CON |= BIT(0);
sys_irq_init(IRQ_UART_VECTOR, 0, uart2_isr_func);
}

中科蓝讯530X、532X模块之硬件UART的更多相关文章

  1. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  2. STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...

  3. 图像处理:卷积模块FPGA 硬件加速

    本文记录了利用FPGA加速图像处理中的卷积计算的设计与实现.实现环境为Altera公司的Cyclone IV型芯片,NIOS II软核+FPGA架构. 由于这是第一次设计硬件加速模块,设计中的瑕疵以及 ...

  4. 自动化之路 python psutil模块 收集硬件信息

    一.psutil模块 1. psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控,分析和限制系统资源及进程的管理.它实现了 ...

  5. 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商. 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量芯片公司崛起 ...

  6. 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2020年发布产品)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商(2020). 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量 ...

  7. 斐讯k2p 月光银 硬件版本A2-软件版本22.7.8.5 刷官改系统

    Mark https://huabuyu.net/斐讯k2p%20月光银%20硬件版本A2-软件版本22.7.8.5%20刷官改系统.html 详细资源推荐:恩山论坛 https://www.righ ...

  8. Air722UG_模块硬件设计手册_V1.1

    下载PDF版本: Air722UG_模块硬件设计手册_V1.1.pdf @ 目录 1. 绪论 2.综述 2.1 型号信息 2.2 主要性能 2.3 功能框图 3.应用接口 3.1 管脚描述 3.2 工 ...

  9. 腾讯tOS死亡或注定,为何国内无自主ROM?

    http://tech.sina.com.cn/roll/2017-06-26/doc-ifyhmtrw4006354.shtml 腾讯OS死亡或注定,为何国内无自主ROM? 2017年06月26日 ...

随机推荐

  1. sqlalchemy怎么order_by降序/升序并取第一条数据

    原文链接:https://blog.csdn.net/mark4541437/article/details/103755721 sqlalchemy怎么order_by降序/升序并取第一条数据 fr ...

  2. ceph 开启mgr balancer

    参考链接: mgr balancer模式探索及配置方法1 mgr balancer模式探索及配置方法2 1.ceph mgr module enable balancer [root@controll ...

  3. Python方法oslo_service.loopingcall.LoopingCallDone代码示例

    Python方法oslo_service.loopingcall.LoopingCallDone代码示例 demo: from oslo_service import loopingcall def ...

  4. 安国AU6989主控 + K9GBG08U0A(NAND) 制作4GB闪存驱动器

    文档标识符:AU6989_FLASH-DRIVE_D-P8 作者:DLHC 最后修改日期:2020.8.22 本文链接: https://www.cnblogs.com/DLHC-TECH/p/AU6 ...

  5. laravel在视图中使用类似于“__PUBLIC__”,“__UPLOADS__”的操作

    首先在config文件夹下建立static.php文件 然后在里面定义常量 例: <?php define('__PUBLIC__', '/'); define('__UPLOADS__', ' ...

  6. 初学WebGL引擎-BabylonJS:第0篇-起因

    学习WebGL的BabylonJS是在一次偶然的情况下进行的,主要为了满足个人对全栈开发的欲望. 言归正传,下面开始简单说说相关过程 WebGL是什么?WebGL是基于html的客户端页面技术,基于h ...

  7. AngularJS中的父作用域与自作用域

    对于$scope上的原生类型,如$scope.name=""; 自作用域获取变量时,会查找作用域本身,找不到就会查找父作用域 修改时,若本作用域不存在,就会在本作用域创建一个变量, ...

  8. 《Offer一箩筐》求职之前你必须知道的 4 件事!!

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」. 如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! Hi~ 这里是 ...

  9. KMP - NOI2014 动物园

    单题分析:NOI2014 动物园. 题目分析:很明显题目已明确指出这是有关KMP的题,思考KMP.本题与普通KMP不同之处在于它求的是不相交最长相同前缀后缀. 如何处理不相交: 1.暴力     2. ...

  10. MySQL通过实体经纬度字段插入数据库point类型的经纬度字段

    说明:数据库:表中没有经度跟纬度字段,只有location字段(point类型) POINT(经度 纬度)实体类:只有经度 lng 字段.纬度 lat 字段 没有location字段 <!--添 ...