This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:TM4C123xx UART stdio

Guru**** 2486815 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/734355/tm4c123gh6pm-tm4c123xx-uart-stdio

器件型号:TM4C123GH6PM

我目前正在处理 UART 和计时器。 UART 器件运行正常、但当我在同一代码中引入计时器时、UART 停止工作。 问题可能出在哪呢?


/* U0Rx 接收连接到 PA0
连接到 PA1的 U0Tx 发送*

#include
#include
#include "tm4c123ghp6.h"


void UART_Init (void);
void PortF_Init (void);
void Porte Init (void);
void Timer_Init (void);


int main (空)

volatile unsigned long delay_timer=0;

字符 c;
PortF_Init();
UART_Init();
Porte Init();

/*这是计时器初始化部分。 取消注释任何语句都会停止 UART*/的工作

// sysctl_RCGC1_R |= 0x00010000;//启用计时器块0的时钟(第460页)
// delay_timer = SYSCTL_RCGC1_R;// 3-4个时钟周期的延迟
// TIMER0_CTL_R = 0x00;//初始化前禁用 Timer0 (第737页)
// TIMER0_CFG_R = 0x00;// 32位选项(pg 727)
// TIMER0_TAMR_= 0x01;//一次性模式和递减计数器(pg 729)
// TIMER0_ICR_R = 0x01;//清除 TimerA 超时标志(第754页)


/* UART 部分*/

while (1){

while ((UART0_FR_R & 0x00000010)!= 0)



C=UART0_DR_R;
如果(c==10)

GPIO_PORTF_DATA_R = 0x08;
UART0_DR_R=c;

UART0_FR_R=0x00000080;
while (((UART0_FR_R&0x00000008)==1)

如果(c==01)

GPIO_PORTF_DATA_R = 0x04;

UART0_DR_R=c;
UART0_FR_R=0x00000080;
while (((UART0_FR_R&0x00000008)==1)





如果(c==00)

GPIO_PORTF_DATA_R = 0x00;
UART0_DR_R=c;
UART0_FR_R=0x00000080;
while (((UART0_FR_R&0x00000008)==1)





/* UART_Init*/

空 UART_Init (空)

SYSCTL_RCGCUART_R |= 0x01;//激活 UART0 *
SYSCTL_RCGC2_R |= 0x01;//激活端口 A */

UART0_CTL_R = 0x00000000;//禁用 UART */
UART0_IBRD_R = 104;// IBRD = int (16、000、000 /(16 * 9600))= int (104.1667)*
UART0_FBRD_R = 11;/* FBRD = ROUND (0.1667 * 64)= 11 */

UART0_LCRH_R = 0x70;// 8位字长(无奇偶校验位、一个停止位、FIFO)*/
UART0_CTL_R = 0x0301;//启用 UART、RXE、TXE、LBE *
GPIO_Porta_AFSEL_R |= 0x03;//在 PA1-0上启用 alt funt */
GPIO_PORta_den_R |= 0x03;//在 PA1-0上启用数字 I/O */
GPIO_Porta_PCTL_R =((GPIO_Porta_PCTL_R 和0xFFFFFF00)+0x00000011);//将 PA1-0配置为 UART */
GPIO_PORta_AMSEL_R &=~0x03;/*禁用 PA 上的模拟功能*

void PortF_Init (void){volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000020;// 1) F 时钟
延迟= SYSCTL_RCGC2_R;//延迟
GPIO_PORTF_LOCK_R = 0x4C4F434B;// 2)解锁 PortF PF0
GPIO_PORTF_CR_R = 0x0E;//允许更改为 PF4-0
GPIO_PORTF_AMSEL_R = 0x00;// 3)禁用模拟功能
GPIO_PORTF_PCTL_R = 0x00000000;// 4) GPIO 清零位 PCTL
GPIO_PORTF_DIR_= 0x0E;// 5) PF4、PF0输入、PF3、PF2、PF1输出
GPIO_PORTF_AFSEL_R = 0x00;// 6)无备用功能
GPIO_PORTF_DEN_R = 0x0E;// 7)启用数字引脚 PF4-PF0

void Porte Init (void){volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000010;// 1) E 时钟
延迟= SYSCTL_RCGC2_R;//延迟
GPIO_Porte _LOCK_R = 0x4C4F434B;// 2)解锁
GPIO_Porte _CR_R = 0x06;//允许更改 PE2-1
GPIO_Porte _AMSEL_R = 0x00;// 3)禁用模拟功能
GPIO_Porte _PCTL_R = 0x00000000;// 4) GPIO 清零位 PCTL
GPIO_Porte _DIR_= 0x06;// 5) PE2-1输出
GPIO_Porte _AFSEL_R = 0x00;// 6)无备用功能
GPIO_Porte _PUR_= 0x06;//启用上拉电阻
GPIO_Porte _DEN_R = 0x06;// 7)使能数字引脚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

          为什么不使用 Tiva ware 库为 UART 和计时器提供的函数?   对寄存器进行编程是一项艰巨的任务、会增加出错的几率。

    此致、

    Digvijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TivaWare 的主要用途之一是无需单个用户了解 DRM 编程的来龙去脉。 因此、对于任何仅与 DRM 编程相关的问题、我们都无法提供大量支持。

    如果您想了解如何使用 DRM 对器件进行编程以便更好地理解、那么 TI 建议首先使用 TivaWare 对项目进行编码、然后将 TivaWare API 部分逐节替换为它们执行的 DRM 代码。

    话虽如此、为何要写入 SYSCTL_RCGC1_R |= 0x00010000以启用 timer0时钟、而不是写入 SYSCTL_RCGCTIME_R 之类的内容?