M0 M4之UART初始化
新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发。例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断。这样可以降低CPU的loading。上面的情况,如果RX只接收到10个字节怎么办呢?这时候就要用到接收超时中断。当RX FIFO中收到1个字节以后,定时器就开始计数,如果定时器超时都没有再收到下一个字节就会发生接收超时中断(RTO)。
每个IP的初始化都需要先初始化时钟,然后才是IP功能初始化。初始化UART之前需要使能要用的晶振,然后选择时钟源并使能时钟。最后将UART用到的引脚切换为UART功能。
void UART0_Init() {
/* UART选择HIRC做时钟源 */
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HIRC;
/* 使能UART0 IP的时钟 */
CLK->APBCLK |= CLK_APBCLK_UART0_EN;
/* PB13用作UART0 接收,PB14用作UART0发送 */
SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
/* Init UART0 */ UART_Open(UART0, );
/*默认数据长度为8bit,没有奇偶校验,1个停止位*/
/*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/
UART_SetLine_Config(UART1, , UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1);
}
UART_Open会根据UART选择的时钟源计算波特率。
上面的代码执行之后,UART_WRITE(UART0, 0x31)就会从UART TX引脚发送0x31了。如果要使用printf打印信息,keil project中加入retarget.c就可以,然后由宏定义#define DEBUG_PORT UART0决定printf从哪个UART口打印。
如果想使用中断接收数据,代码如下:
void UART0_Init() {
/* 选择UART时钟源 */
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HIRC;
/* 使能UART0 IP的时钟 */
CLK->APBCLK |= CLK_APBCLK_UART0_EN;
/* PB13用作UART0 接收,PB14用作UART0发送 */
SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
/* Init UART0 */ UART_Open(UART0, );
/*默认数据长度为8bit,没有奇偶校验,1个停止位*/
/*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/
UART_SetLine_Config(UART1, , UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1); /*设置接收超时时间为40,单位波特率*/ UART_SetTimeoutCnt(UART0, ); /*设置接收FIFO触发级别为14B*/ UART_SET_RX_FIFO_INTTRGLV(UART0, UART_TLCTL_RFITL_14BYTES);
/*使能接收FIFO 阀值中断,和接收超时中断*/
UART_ENABLE_INT(UART0, (UART_IER_RDA_IE_Msk | UART_IER_RTO_IE_Msk)); NVIC_EnableIRQ(UART0_IRQn);
}
/*UART0中断处理函数*/
void UART0_IRQHandler(void) {
uint8_t u8InChar=0xFF;
uint32_t u32IntSts= UART0->ISR;
/*发生接收阀值中断或者接收超时中断*/
if(u32IntSts & (UART_ISR_RDA_IS_Msk| UART_ISR_RTO_IS_Msk))
{ /* 读走接收FIFO中所有的数据,直到接收FIFO为空 */
while(UART_GET_RX_EMPTY(UART0)==) {
/* 从接收FIFO中读一个数据 */
u8InChar = UART_READ(UART0);
}
}
}
UART IP有个复位函数:SYS_ResetModule(UART0_RST); 其实新唐的芯片每个IP都有单独的复位控制。什么时候需要复位UART0呢?如果该代码是通过CPU reset执行到的,那原本UART可能在工作,RX FIFO中可能有数据,可能会发生中断等等一些无法预估的事情,这时候最好复位一下UART IP的逻辑。
M0 M4之UART初始化的更多相关文章
- M0 M4之GPIO初始化
新唐所有的M0/M4芯片基本上所有的IO都可以发生中断,为了符合大家的习惯还是有所谓的外部中断EINT0和EINT1.有2跟GPIO脚可以配置为EINT0功能和EINT1功能,分别将发生EINT0中断 ...
- M0 M4之Timer初始化
新唐的定时器一般有很多功能:普通的定时功能,事件计数功能,捕获功能,超时触发ADC等等.大家如果感兴趣可以读一下<NANOB Timer功能介绍以及在弱灌注中的应用.pdf>,虽然各个系列 ...
- 新唐M0 M4系统初始化
系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function Pin 简称MFP寄存器)配置.void SYS_Init(void) { /* 解锁保护寄存器 */ SYS_Un ...
- 【AT91SAM3S】串口UART初始化及收发数据
SAM3S中的UART串口是一个两线异步收发器.这个串口能用来通信或者跟踪.有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间. SAM3S4C中有两个UART.与外设引 ...
- M0 M4时钟控制(一)
时钟控制器为整个芯片提供时钟源,包括系统时钟和所有外围设备时钟.该控制器还通过单独时钟的开或关,时钟源选择和分频器来进行功耗控制.在CPU使能低功耗PDEN(CLK_PWRCTL[7]) 位和Cort ...
- M0 M4关于库函数的讲解(以时钟为例)
#define CLK_PWRCON_PD_WAIT_CPU_Pos 8 #define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_ ...
- 关于新塘 M0 M4添加库文件的说明
- ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程
对于S5PV210 UART驱动来说,主要关心的就是drivers/serial下的samsung.c和s5pv210.c连个文件. 由drivers/serial/Kconfig: config S ...
- z-stack协议uart分析(DMA)
1.从ZMain里面的main函数开始分析 2.进入int main( void ); HalDriverInit(); //硬件相关初始化,有DMA初始化和UART初始化 3.进入HalDriv ...
随机推荐
- 一款基于jquery实现的鼠标单击出现水波特效
今天要为大家绍一款由jquery实现的鼠标单击出现水波特效.用鼠标猛点击页面,你可以看到页面不断出面水波纹效果.然后水波纹渐渐消失.效果非常不错.我们一起看下效果图: 在线预览 源码下载 实现的代 ...
- [uart]3.tty驱动分析
转自:http://www.wowotech.net/linux_kenrel/183.html 目录: 1 首先分析设备驱动的注册 1.1 uart_register_driver分析 1.2 tt ...
- Android——用对话框做登陆界面(自定义对话框AlertDialog,多线程,进度条ProgressDialog,ListView,GridView,SharedPreferences存,读数据,存取文本,assets文件)
效果: 1.点击图标进入页面二 2.页面2图片暂停显示5秒进入页面三 3.点击页面三登陆按钮,打开登陆对话框,输入密码进入页面四 点击下载按钮,显示水平进度条 点击保存和获取用户名和密码 进入页面六 ...
- CentOS安装ssh服务
yum search ssh yum install openssh-server service sshd status [编辑]艺搜参考 http://www.cnblogs.com/eastso ...
- TCP协议的问题
Server端接收到Client端信息后不会返回给Client端 // TCPEchoServer.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h&quo ...
- Android解决下拉刷新控件SwipeRefreshLayout和ViewPager的滑动冲突
直接说明下我自己项目中的情况,如图: 外部嵌套任何一种refresh下拉控件之后,上方的viewpager左右滑动事件都受到影响,滑动不流畅,稍微有点向下的趋势就会触发刷新. 起初以为可能跟不同下拉控 ...
- 何为中间语言IL?
一直以来,对于.NET与C#之间的关系我都存在着疑惑,为此,今天专门仔细看了一下以前最容易忽略掉的书本“前言”部分,予以澄清:) 首先,c#的结构和方法论反映了.NET的基础方法论,在很多情况下,c# ...
- Hadoop2的Yarn和MapReduce2相关
转自: http://www.aboutyun.com/thread-7678-1-1.html.. 问题导读: 1.什么是yarn? 2.Yarn 和MapReduce相比,它有什么特殊作用 ? ...
- thinkphp 连接mssql 当local失效时
<?php return array( //'配置项'=>'配置值' //'USERNAME'=>'admin', //赋值 //数据库配置信息 'DB_TYPE' => 'm ...
- ThinkPHP3.2 介绍
模块化 驱动化 为云平台而生ThinkPHP3.2正式版发布! ThinkPHP是国内领先的WEB应用开发框架,诞生于2006年初,在国内具有良好的口碑和广大的用户群,秉承了大道至简的开发理念,让WE ...