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.

[参考译文] TM4C1231E6PZ:TM4C1231E6PZ 事件计数器问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/590511/tm4c1231e6pz-tm4c1231e6pz-event-counter-problem

器件型号:TM4C1231E6PZ

您好!

我正在使用 TM4C1231E6PZ 微控制器并执行事件计数器操作。

我无法在定时器寄存器中加载值(使用  ROM_TimerLoadSet (Timer1_base、timer_A、0); )。

我将其配置为 Timer1A 的上数事件计数器模式。 其余所有带有 UART7和定时器0的代码工作正常。

有人可以对此提供帮助吗?

 

Kiran

 

代码如下所示。

void counter1_init()

//
//启用此示例使用的外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);

//
//将 PM0配置为计时器1的 CCP0引脚。
//

ROM_GPIOPinTypeTimer (GPIO_PORTF_BASE、GPIO_PIN_2);
ROM_GPIOPinConfigure (GPIO_PF2_T1CCP0);

//
//将定时器配置为下降沿计数模式。
//
ROM_TimerConfigure (Timer1_base、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_COUNT_UP));
ROM_TimerControlEvent (Timer1_base、timer_A、timer_event_POS_EDGE);
ROM_TimerLoadSet (Timer1_base、timer_A、0);

//
//启用计时器。
//
ROM_TimerEnable (Timer1_base、timer_A);

我将发送其余代码供参考。

#include
#include
#include "inc/hw_memmap.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/rom.h"

#include "delay.h"
#include "init.h"
#include "促 动器.h"
#include "lcd.h"
#include "rtc.h"

const unsigned char a_Msg1[85]="机电 一体化系统"\
"私人有限公司。 "\
"版本 KBJNLACTV1.0 "\
"日期:2017年4月21日";

typedef unsigned char tBoolean ;

tBoolean bToggle;

unsigned char a_asci[10];
long int lCurrentCount=0、lOldCount = 5000;

int main (空)

unsigned long ulDirection;
long int lCount=0;

//
//将时钟设置为直接从晶体运行。
//
ROM_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);
init_pinconfig();
delay_ms (1);
init_lcd();
delay_ms (1);
CLEAR_LCD();

Display_LCD (A_Msg1);
delay_ms (1000);

timer0_init();
counter1_init();
uart7_init();
delay_ms (1);

while (1)

lCount = ROM_TimerValueGet (Timer1_base、timer_A);

if (lCount!= 0)

ulDirection = ROM_GPIOPinRead (GPIO_PORTF_BASE、DIRN);
if (ulDirection)(指令)

lCurrentCount = lCurrentCount + lCount;

其他

lCurrentCount = lCurrentCount - lCount;

ROM_TimerLoadSet (Timer1_base、timer_A、0);

十进制到 ASCII (lCount、6);
A_ASCII[6]='\0';
Display_LCD_line (Page2、A_ASCII);

if (bToggle) ROM_GPIOPinWrite (GPIO_Porta_base、DIRN_RLY、DIRN_RLY_ON);
ELSE ROM_GPIOPinWrite (GPIO_PORta_base、DIRN_RLY、DIRN_RLY_OFF);
delay_ms (1000);


//
//
//第一个计时器中断的中断处理程序。
//
//
空 Timer0IntHandler (空)

//
//清除计时器中断。
//
ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

bToggle =~bToggle;

//
//
// UART 中断处理程序。
//
//
无效
UART7IntHandler (空)

uint32_t ui32Status;
unsigned long ulUart7In;
//
//获取中断状态。
//
ui32Status = ROM_UARTIntStatus (UART7_BASE、TRUE);

//
//清除已发出的中断。
//
ROM_UARTIntClear (UART7_BASE、ui32Status);

//
//在接收 FIFO 中有字符时循环。
//
while (ROM_UARTCharsAvail (UART7_BASE))

//
//从 UART 读取下一个字符并将其写回 UART。
//
ulUart7In = ROM_UARTCharGetNonBlocking (UART7_BASE);

ROM_GPIOPinWrite (GPIO_PORTB_BASE、RS485、RS485_TX_ENABLE);
delay_ms (1);
ROM_UARTCharPutNonBlocking (UART7_BASE、ulUART7In);
delay_ms (1);
ROM_GPIOPinWrite (GPIO_PORTB_BASE、RS485、RS485_RX_ENABLE);


void init_pinconfig()

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);


//输入引脚配置
ROM_GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_3);//自动
ROM_GPIOPinTypeGPIOInput (GPIO_PORTB_BASE、GPIO_PIN_2);//手动
ROM_GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_1);//句柄
ROM_GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_0);//NOT_OP
ROM_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_4);//远程
ROM_GPIOPinTypeGPIOInput (GPIO_PORTG_base、GPIO_PIN_4);//代理 DN
ROM_GPIOPinTypeGPIOInput (GPIO_PORTG_base、GPIO_PIN_5);//代理启动
HWREG (GPIO_PORTF_BASE_GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_BASE_GPIO_O_CR)|= GPIO_PIN_0;
ROM_GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_2);//ROTN
ROM_GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_3);//DIRN

ROM_GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_2);/C1.
ROM_GPIOPinTypeGPIOInput (GPIO_Porth_BASE、GPIO_PIN_0);//C2
ROM_GPIOPinTypeGPIOInput (GPIO_Porth_BASE、GPIO_PIN_1);//C3
ROM_GPIOPinTypeGPIOInput (GPIO_Porth_BASE、GPIO_PIN_2);//C4
ROM_GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_4);//C5

ROM_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_7);//down
ROM_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_6);//停止
ROM_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_5);//up

//输出引脚配置

ROM_GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3);//MOTOR_ON
ROM_GPIOPinWrite (GPIO_Porta_base、电机、MOTOR_OFF);

ROM_GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_4);//DIRN_RLY
ROM_GPIOPinWrite (GPIO_PORta_base、DIRN_RLY、DIRN_RLY_OFF);

ROM_GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_5);//SD
ROM_GPIOPinWrite (GPIO_Porta_base、SD、SD_off);

ROM_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_3);//R1
ROM_GPIOPinWrite (GPIO_Porte _BASE、ROW1、ROW1_DISABLE);

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTJ_BASE、GPIO_PIN_2);//R2
ROM_GPIOPinWrite (GPIO_PORTJ_BASE、ROW2、ROW2_DISABLE);

ROM_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_5);//R3
ROM_GPIOPinWrite (GPIO_Porte _BASE、Row3、Row3_disable);

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTG_base、GPIO_PIN_3);//SDA
ROM_GPIOPinWrite (GPIO_PORTG_base、SDA、SDA_set);

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTG_base、GPIO_PIN_2);//SCL
ROM_GPIOPinWrite (GPIO_PORTG_BASE、SCL、SCL_SET);

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);//485
ROM_GPIOPinWrite (GPIO_PORTB_BASE、RS485、RS485_RX_ENABLE);

// LCD 引脚配置

ROM_GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_4);//rw
ROM_GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_5);//RS
ROM_GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_6);//RST
ROM_GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_7);//EN

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_1);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_3);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_4);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_5);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_6);
HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_O_CR)= 0xff;
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_7);

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);//打开
ROM_GPIOPinWrite (GPIO_PORTB_BASE、LCD、LCD_ON);// LCD 模块启用

void  // Timer0初始化

空 timer0_init()

//
//启用此示例使用的外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

//
//启用处理器中断。
//
ROM_IntMasterEnable();

//
//配置两个32位周期定时器。
//
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、ROM_SysCtlClockGet ());


//
//设置计时器超时的中断。
//
ROM_IntEnable (INT_TIMER0A);
ROM_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);

//
//启用计时器。
//
ROM_TimerEnable (TIMER0_BASE、TIMER_A);

void timer0_disable()

ROM_TimerDisable (TIMER0_BASE、TIMER_A);

void uart7_init()

//
//启用此示例使用的外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART7);

//
//启用处理器中断。
//
ROM_IntMasterEnable();

//
//将 GPIO A0和 A1设置为 UART 引脚。
//
ROM_GPIOPinConfigure (GPIO_PE0_U7RX);
ROM_GPIOPinConfigure (GPIO_PE1_U7TX);
ROM_GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1);

//
//将 UART 配置为115、200、8-N-1操作。
//
ROM_UARTConfigSetExpClk (UART7_BASE、ROM_SysCtlClockGet ()、19200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

//
//启用 UART 中断。
//
ROM_IntEnable (INT_UART7);
ROM_UARTIntEnable (UART7_BASE、UART_INT_RX | UART_INT_RT);

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

    我已将编码器输出作为输入应用到计数器(Timer1-A)

    我还写了以下逻辑来避免这个问题(不能在定时器寄存器中加载值(使用 ROM_TimerLoadSet (Timer1_base、timer_A、0);)。

    lTimerACount = ROM_TimerValueGet (Timer1_base、timer_A);//读取计数器值
    if (lTimerACount >= lPreviousCount) //检查计时器寄存器中是否有任何计数。

    lCountDiff = lTimerACount - lPreviousCount;

    其他

    lCountDiff =(65535 - lPreviousCount)+ lTimerACount;


    if (lCountDiff!= 0)

    lCountDiff = lCountDiff * 10;
    DIRN = ROM_GPIOPinRead (GPIO_PORTF_BASE、编码器_DIRN);
    IF (DIRN) //检查方向输入

    bMovingUp = 1;
    liActualCount += lCountDiff;
    if (liActualCount >= ulMaxCount)liActualCount = ulMaxCount;

    其他

    bMovingDown = 1;
    liActualCount -= lCountDiff;
    if (liActualCount <= 0)liActualCount = 0;


    if (!bUpdate)

    liCurrentCount = liActualCount;
    bCalculate = 1;

    uLcdOffDelay = 0;
    lPreviousCount = lTimerACount; //将电流计数加载到旧计数中


    但希望在复制到临时变量 lTimerACount 后立即在计时器寄存器中加载0计数。

    是否有关于上述问题的指导?

    此致、

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

    您好 Kiran、

     抱歉、您的帖子似乎错过了几天。 请注意、在输入边沿计数模式中、GPTMnnILR 必须大于 GPTMnPMR。  

    在向上计数模式下、
    定时器从0x0开始计数到 GPTMTnMATCHR 和 GPTMTnPMR 寄存器中的值。 注释
    执行递增计数时、GPTMTnPR 和 GPTMTnILR 的值必须大于
    GPTMTnPMR 和 GPTMTnMATCHR 的值。

    另请参阅以下帖子、该帖子将帮助回答您的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Charles -您(在自由时刻)是否可以评论(多张)海报的"阴茎"在 MCU 的器件型号上"加倍"、以便在其"主题/标题"行中进行演示?

    (即 TM4C1231E6PZ:TM4C1231E6PZ) 似乎毫无意义-更加努力地更清楚地介绍他们的问题-似乎更有成效...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 CB1、

     是的、我经常发现某些帖子的标题中会有两次提及的器件型号。 我不确定海报是否能看到我在下面的帖子条目中看到的内容。 在 E2E 主题标题字段中、有一个婚前提示"如果在上面输入了器件型号、请勿重复..." 我不太确定在创建新帖子时、婚前是否会出现空白。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查尔斯-作为一名侦探、您有一个"未来"(同时也是一名熟练的 EE)、我敢肯定! 我从未/曾经指出过这一点。 (可能是因为我多次撰写并发布了"论坛指南"、以便获得很好的(即没有)回应。)

    如果这证明了原因、"部件号加倍"、我对这张海报表示歉意。 最常见的主题是匆忙-不引人注目-海报必须意识到他们有责任推销自己的帖子! (否则——他们(几乎)乞讨——这不好!)