1638|1

3836

帖子

19

TA的资源

纯净的硅(中级)

TMS320C6748_UART(2) - 初始化配置 [复制链接]

 1.UART结构
  UART2输入时钟为PLL1_SYSCLK2,PLL1_SYSCLK2是PLL1_SYSCLK1的2分频,PLL1_SYSCLK1的频率默认为456MHz,PLL时钟树如图:

image.png

(指南P130)

image.png

(指南P131)

2.UART使用中最常用到的API
(1)UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk,unsigned long ulBaud, unsigned long ulConfig)
带时钟参数的UART配置函数,参数分别是UART模块基地址,系统主频,波特率,数据帧格式配置。
这个函数功能非常强大,可以说一句话就完成了第二步工作。
这个函数的执行结果是:设置波特率为ulBaud,将数据帧格式设置为ulConfig,使能FIFO,使能UART。
数据帧格式配置参数ulConfig是由三个参数进行或运算得来的,这三个参数是数据字长(WordLENgth),奇偶校验(PARity),停止位长度(STOP)。

(2)UARTEnable(unsigned long ulBase),UARTDisable(unsigned long ulBase)
使能和禁能UART


(3)UARTFIFOEnable(unsigned long ulBase),UARTFIFODisable(unsigned long ulBase)  UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1)
UARTFIFOEnable函数:使能和禁能FIFO

UARTFIFOLevelSet函数:设置 FIFO 级别,设置FCR寄存器的FIFO的RXFIFTL位,即接收FIFO触发水平。

 

(4)void UARTCharPut(unsigned long ulBase, unsigned char ucData),tBoolean UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData)
发送一个字符到THR中,判断LSR寄存器中的THRE位和TEMT位,区别是:
使用UARTCharPut函数:

    FIFO模式 - 等待发送FIFO和THR中都为空时,发送字符。   
非FIFO模式 - 等待TSR和THR都为空时,发送字符。 
  如果发送FIFO满,函数会等待发送FIFO变成非满状态再将要发送字符放入发送FIFO。
使用UARTCharPutNonBlocking函数

    FIFO模式 - 如果发送FIFO和THR中都为空时,发送字符。   
非FIFO模式 - 如果TSR和THR都为空时,发送字符。 
即UARTCharPut函数会等待THR和TSR都为空时发送字符,而UARTCharGetNonBlocking函数不会等待。

(5)void UARTCharGet(unsigned long ulBase),tBoolean UARTCharGetNonBlocking(unsigned long ulBase)
接收一个字符到RBR中,判断LSR寄存器中的DR位,区别是:
使用UARTCharGet函数:

   FIFO模式 - 等待FIFO非空(至少有一个未读取字符),即RBR中有数据时,获取字符。   
非FIFO模式 - 等待RBR中有数据时,获取字符。 
使用UARTCharGetNonBlocking函数:

    FIFO模式 - 如果FIFO非空,获取字符,如果FIFO为空,则会放弃接收并返回false。   
非FIFO模式 - 如果RBR中有数据时,获取字符,如果RBR为空,则会放弃接收并返回false。
即UARTCharGet函数会等待接收字符,而UARTCharGetNonBlocking函数不会等待。


(6)tBoolean UARTCharsAvail(unsigned long ulBase),tBoolean UARTSpaceAvail(unsigned long ulBase)
UARTCharsAvail函数:查看接收FIFO或是RBR寄存器是否有数据,如果有数据则返回True,表示可接收数据,否则返回False。

UARTSpaceAvail函数:查看TSR和THR是否都为空,是则返回True,表示可发送数据,否则返回False。

3.初始化配置
    定义UART2输入时钟频率如下:

1  // 时钟
2  #define SYSCLK_1_FREQ (456000000)
3  #define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
4  #define UART_2_FREQ (SYSCLK_2_FREQ) 
    主函数如下:

复制代码
 1 intmain(void)
 2 {
 3     // 外设使能配置
 4     PSCInit();
 5  
 6     // GPIO 管脚复用配置
 7     GPIOBankPinMuxSet();
 8  
 9     // DSP 中断初始化
10     InterruptInit();
11  
12     // UART 初始化
13     UARTInit();
14  
15     // UART 中断初始化
16     UARTInterruptInit();
17  
18     // 主循环
19     for(;;)
20     {
21  
22     }
23 }
复制代码
其中,GPIOBankPinMuxSet()函数如下:

1 voidGPIOBankPinMuxSet(void)
2 {
3     // UART2 禁用流控
4     UARTPinMuxSetup(2, FALSE);
5 }
  UARTPinMuxSetup函数为创龙开发板特有的配置函数,该函数位于starterware/application/platform目录工程中的UART.C文件里。该函数对系统配置模块0(System Configuration Module 0,SYSCFG0)的引脚复用控制寄存器4(Pin Multiplexing Control 4 Register,PINMUX4,地址值为0x01C1 4130h)进行设置,将GP1[2]脚功能设置为UART2_TXD,该脚作为UART2的发送脚,将GP1[3]脚功能设置为UART2_RXD,该脚作为UART2的接收脚。PINMUX4寄存器地址及其各字段含义如下所示,UARTPinMuxSetup附在图后。

image.png

(指南P204)

image.png

(指南P225)

image.png

(指南P225)

image.png

(指南P226) 

复制代码
 1 /****************************************************************************/
 2 /* */
 3 /* 管脚复用配置 */
 4 /* */
 5 /****************************************************************************/
 6 voidUARTPinMuxSetup(unsignedint instanceNum, unsignedint modemCtrlChoice)
 7 {
 8 unsignedint svPinMuxRtsCts = 0;
 9 unsignedint svPinMuxTxdRxd = 0;
10  
11 if(0 == instanceNum)
12 {
13 if(TRUE == modemCtrlChoice)
14 {
15 svPinMuxRtsCts = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) & \
16 ~(SYSCFG_PINMUX3_PINMUX3_27_24 | \
17 SYSCFG_PINMUX3_PINMUX3_31_28));
18  
19 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) = \
20 (PINMUX3_UART0_CTS_ENABLE | \
21 PINMUX3_UART0_RTS_ENABLE | \
22 svPinMuxRtsCts);
23 }
24  
25 svPinMuxTxdRxd = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) & \
26 ~(SYSCFG_PINMUX3_PINMUX3_23_20 | \
27 SYSCFG_PINMUX3_PINMUX3_19_16));
28  
29 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) = \
30 (PINMUX3_UART0_TXD_ENABLE | \
31 PINMUX3_UART0_RXD_ENABLE | \
32 svPinMuxTxdRxd);
33 }
34  
35 elseif(1 == instanceNum)
36 {
37 if(TRUE == modemCtrlChoice)
38 {
39 svPinMuxRtsCts = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \
40 ~(SYSCFG_PINMUX0_PINMUX0_23_20 | \
41 SYSCFG_PINMUX0_PINMUX0_19_16));
42  
43 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
44 (PINMUX0_UART1_CTS_ENABLE | \
45 PINMUX0_UART1_RTS_ENABLE | \
46 svPinMuxRtsCts);
47 }
48  
49 svPinMuxTxdRxd = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & \
50 ~(SYSCFG_PINMUX4_PINMUX4_31_28 | \
51 SYSCFG_PINMUX4_PINMUX4_27_24));
52  
53 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = \
54 (PINMUX4_UART1_TXD_ENABLE | \
55 PINMUX4_UART1_RXD_ENABLE | \
56 svPinMuxTxdRxd);
57 }
58  
59 elseif(2 == instanceNum)
60 {
61  
62 if(TRUE == modemCtrlChoice)
63 {
64 svPinMuxRtsCts = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \
65 ~(SYSCFG_PINMUX0_PINMUX0_31_28 | \
66 SYSCFG_PINMUX0_PINMUX0_27_24));
67  
68 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
69 (PINMUX0_UART2_CTS_ENABLE | \
70 PINMUX0_UART2_RTS_ENABLE | \
71 svPinMuxRtsCts);
72 }
73  
74 svPinMuxTxdRxd = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & \
75 ~(SYSCFG_PINMUX4_PINMUX4_23_20 | \
76 SYSCFG_PINMUX4_PINMUX4_19_16));
77  
78 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = \
79 (PINMUX4_UART2_TXD_ENABLE | \
80 PINMUX4_UART2_RXD_ENABLE | \
81 svPinMuxTxdRxd);
82  
83 }
84  
85 else
86 {
87  
88 }
89 } 
复制代码
  管脚复用配置完成后,就要对UART进行初始化了。初始化参考步骤如图所示:

image.png

(指南P1427)

  UART初始化函数中,首先配置UART2的参数。设置UART2波特率为115200bps,UART2模块的内存地址为0x01D0D000,波特率在UART模块的DLL(Divisor LSB Latch)和DLH(Divisor MSB Latch)寄存器中设置,DLL存储Divisor的低8位,DLH存储Divisor的高8位,在波特发生器(Baud generator)中对UART输入时钟进行分频,分频系数为Divisor,从而产生波特时钟(baud clock,BCLK)。波特时钟BCLK的值应为波特率的16倍或13倍,具体是16倍还是13倍取决于过采样率,如果是16倍过采样,则16个波特时钟才完成1bit的传输,如果是13倍过采样则是13个波特时钟。计算公式及UART时钟发生框图如下所示:

image.png

(指南P1419) 

  设置UART的帧格式为数据位8,停止位1,无校验位,帧格式在流控制LCR(Line Control Register)中定义。设置过采样模式(Over-Sampling Mode,OSM)为16倍过采样,采样模式在MDR(Mode Definition Register)寄存器中定义。

image.png

(手册P23)

image.png

(指南P1430)

  完成UART2初始化后,就开始使能UART2。使能UART2,只要设置PWREMU_MGMT寄存器的UTRST、URRST和FREE3位就行了。

image.png

(指南P1447)

  然后使能接收和发送FIFO,在FCR寄存器中对相应位进行设置。通过使能FIFO,可以减少软件对CPU的过度开销,因为FIFO可以对要发送或接收的字符进行缓存(buffering),所以不用每接收或者发送一个字节就中断一次这样频繁地打断CPU的进程,只有当FIFO满了之后才通知CPU,一次把所有的数据处理完,大大提高了CPU的工作效率。

image.png

  使能FIFO后还要设置FIFO级别,接收器FIFO可以设置为1字节满,4字节满,8字节满或14字节满共4个级别。

image.png

(指南P1436)

这样,UART初始化就完成了,UART初始化代码如下:

复制代码
 1 voidUARTInit(void)
 2 {
 3     // 配置 UART2 参数
 4     // 波特率 115200 数据位 8 停止位 1 无校验位
 5 UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
 6          UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
 7     // 使能 UART2
 8     UARTEnable(SOC_UART_2_REGS);
 9  
10 // 使能接收 / 发送 FIFO
11 UARTFIFOEnable(SOC_UART_2_REGS);
12  
13 // 设置 FIFO 级别
14 UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
15 }
复制代码
 4.UART发送和接收过程
  UART寄存器中发送部分有发送保持寄存器 (THR—transmitter hold register) 和发送移位寄存器 (TSR—transmitter shift register),接收部分有接收保持寄存器 (RSR—receiver shift register) 和接收移位寄存器 (RBR—receiver buffer register)。

  其中THR、RBR和DLL共用一个地址,由LCR寄存器的DLAB位控制。在FIFO模式,RBR和THR为16字节。

发送数据——THR接收到内部总线数据,且TSR准备好(判断LSR寄存器中的TEMT和THRE位):THR→TSR→UARTn_TXD;

接收数据——RSR接收UARTn_RXD数据(判断LSR中的DR位):UARTn_RXD→RSR→RBR(或接收FIFO);

 

 5.UART中断触发
  当UART中断发生且在相应的IER寄存器使能时,则中断鉴别寄存器(IIR)的IPEND位为0,当中断清除或出现硬件复位时,则IPEND位为1.

①发送模式:

非FIFO模式:中断使能寄存器 (IER) 的ETBEI = 1时,此时THR和TSR为空,则队列状态寄存器LSR中的THRE(THR指示器)为1,UART触发发送。

  此时的中断标志(IIR)寄存器中的INTID位为1,表示发送寄存器为空,UART中断服务函数中判断该位,来判断是否发送中断产生。当 THR 装载了字符或者中断鉴别寄存器 (IIR) 被读取该中断便清除,即INTID位为0。 

FIFO模式:中断使能寄存器 (IER) 的ETBEI = 1时,此时FIFO为空(FIFO中最后一个字符被发送到了TSR中),则队列状态寄存器LSR中的THRE(THR指示器)为1,UART触发发送。

  此时的中断标志(IIR)寄存器中的INTID位为1,表示发送寄存器为空,UART中断服务函数中判断该位,来判断是否发送中断产生。至少一个字节装载到 FIFO 或 IIR 被读取中断将清除。

②接收模式:

非 FIFO 模式:中断使能寄存器 (IER) 的ERBI = 1时,此时一个字符到达 RBR 寄存器时,便产生一个中断。

  此时的中断标志(IIR)寄存器中的INTID位为2,表示接收数据可用,UART中断服务函数中判断该位,来判断是否接收中断产生。当 RBR 内的字符被读取中断清除。

FIFO 模式:中断使能寄存器 (IER) 的ERBI = 1时,此时当 FIFO 中数据填充到 FIFO 控制寄存器 (FCR) 内选择的触发水平便产生一个中断。

  此时的中断标志(IIR)寄存器中的INTID位为2,表示接收数据可用,UART中断服务函数中判断该位,来判断是否接收中断产生。当 FIFO 内容低于触发水平中断将清除。

image.png

(其中,FCR寄存器的RXFIFO位表示了触发水平。)

最新回复

我的中断接收里的中断标志(IIR)寄存器中的INTID位为3,OE位为1,所以无法再次接收数据,请问怎么解决呀?麻烦您了!   详情 回复 发表于 2020-10-29 15:57

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

我的中断接收里的中断标志(IIR)寄存器中的INTID位为3,OE位为1,所以无法再次接收数据,请问怎么解决呀?麻烦您了!


回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表