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:复位时的系统时钟频率是多少?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/916188/tm4c123gh6pm-what-is-the-system-clock-frequency-on-reset

器件型号:TM4C123GH6PM

我刚刚动手使用这个 Tiva 开发板、并尝试让 LED 闪烁。 数据表建议复位时、PIOSC (16MHz)被选为系统时钟。 但是、当我尝试向 SysTick 加载寄存器传递16000000以使 LED 以1Hz 的频率闪烁时、LED 的闪烁速度似乎比1Hz 快。 我将其连接到示波器、发现频率为1.5Hz (320ms 高电平和低电平时间)。

以下是我的代码,如果它有帮助:

#include "TM4C123.h" //设备标头


void blinkLED (int count);

int main()
{
sysctl->RCGCGPIO |=1<<5;//时钟端口 F

GPIOF->DIR |=(1<3);//pF3配置为输出
GPIOFF->DEN |=(1<<3);//在 PF3<=(void














Data Handler){=(blink-}(void }-1});//翻转数据处理程序(while 循环计数(void }-1<1<1}(void ^)//从0
SysTick ->VAL = 0开始;
SysTick ->CTRL = 7;
} 



我甚至注意到在对 UART 驱动程序进行编程以与 PC 通信时出现的问题。 有时、它会显示垃圾字符(波特率计算采用16MHz 系统时钟)。

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

    您好!

     首先、请参阅此 TM4C 常见问题 解答 https://e2e.ti.com/support/microcontrollers/other/f/908/t/695568中的项目4。 基本上、我们不支持 DRM 编程风格。 我们建议用户使用 TivaWare 来开发其应用。 如果您必须使用 DRM、那么您可以首先参考 TivaWare API 的源代码、了解如何为外设配置寄存器。  

     下面是我使用 TivaWare 在 PF2上创建1Hz 闪烁 LED 的代码。 请将 SysTick 寄存器配置与您的配置进行比较。

    另请注意、PIOSC 的容差最大为3%。

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    
    
    
    
    
    
    
    #include "driverlib/rom.h"#include "driverlib/sctl.h"#include "driverlib/symdio.us
    //
    //! \addtogroup SysTK_examples_list
    //! 

    SysTick 中断(SysTick _int)

    //! //! 此示例展示了如何配置 SysTick 和 SysTick 中断。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! -无 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 操作 //! SysTick。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -SysTickIntHandler // //************* // // //计数器来计算已调用的中断数。 //// ***************** 易失性 uint32_t g_ui32Counter = 0; //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // // SysTick 中断的中断处理程序。 //// ***************** void SysTickIntHandler (void) { // //更新 SysTick 中断计数器。 // G_ui32Counter++; 如果((g_ui32Counter % 2)= 0){ GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2); } 否则{ GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0); } } //********* // //将 SysTick 和 SysTick 中断的周期配置为1秒。 //// ***************** int main (void) { uint32_t ui32PrevCount = 0; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // // SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | // SYSCTL_XTAL_16MHz); SysCtlClockSet (SYSCTL_OSC_INT | SYSCTL_USE_OSC); // //启用用于板载 LED 的 GPIO 端口。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); // //为 LED 启用 GPIO 引脚(PF2 & PF3)。 // ROM_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2); // //设置用于显示消息的串行控制台。 这是 //仅用于此示例程序,SysTick 操作不需要。 // InitConsole(); // //在控制台上显示设置。 // UARTprintf ("SysTick 触发中断->"); UARTprintf ("\n 速率= 1sec\n"); // //初始化中断计数器。 // G_ui32Counter = 0; // //设置 SysTick 计时器的周期。 SysTick 计时器周期 //等于系统时钟,产生1秒的周期。 // SysTickPeriodSet (SysCtlClockGet ()/2); // //启用到处理器的中断。 // IntMasterEnable(); // //启用 SysTick 中断。 // SysTickIntEnable(); // //启用 SysTick。 // SysTickEnable(); // //在 SysTick 运行时永久循环。 // while (1) { // //检查 SysTick 中断计数是否发生更改,如果发生更改 //打印带有计数的消息。 // if (ui32PrevCount!= g_ui32Counter) { // //打印中断计数器。 // UARTprintf ("中断数:%d\r"、g_ui32Counter); ui32PrevCount = g_ui32Counter; } }