您好我最近一直在使用Tm4c123gh6pm进行编码,而且我遇到了一个我想要使用边缘计时模式的部分,现在我还没去过tivaware api&si; si只是去传统的寄存器级别和按照数据表,我遇到了这个问题 我想知道哪个引脚用作定时器等待上升沿的引脚,以便它移动当前的定时器值? 我检查了数据表所有我能找到的是,计时器0与PB6和PF0有某种关系现在我尝试了PB6并且它没有工作,但这是否是正确的方法? 这些是正确的引脚,微控制器的定时器等待上升沿移动当前定时器值? 这里是我的代码示例,请注意,这只是一个测试代码,我尝试它不是最终的代码,我做的是复制数据表中的初始化部分为我想要的定时器模式,并一步一步地遵循它 此代码将使计数器从0xFF开始向下运行,但是当我放置一个“高”的时候。信号,即PB6上的3.3伏电压,没有任何信号被移到GPTMTnR寄存器。 我只是想知道是否有什么东西我做错了而且我没有注意到?
#include "tm4c123gh6pm.h"
void Timer0Init(void);
int main(void)
{
int i=0;
Timer0Init();
while(1){
for(i=0;i<100000;i++){
}
}
return 0;
}
void Timer0Init(void)
{
//initialize PORT B
volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000002; // 1) B clock
delay = SYSCTL_RCGC2_R; // delay to allow clock to stabilize
GPIO_PORTB_AMSEL_R &= 0x00; // 2) disable analog function
GPIO_PORTB_PCTL_R &= 0x00000000; // 3) GPIO clear bit PCTL
GPIO_PORTB_DIR_R &= 0x00; // 4.2) PB all input
GPIO_PORTB_AFSEL_R &= 0x40; // 5) no alternate function
GPIO_PORTB_DEN_R |= 0xFF; // 7) enable digital pins PF4-PF1
GPIO_PORTB_PCTL_R = 7;
//timer clock
SYSCTL_RCGCTIMER_R |=0x01;
delay = SYSCTL_RCGCTIMER_R;
//1. Ensure the timer is disabled (the TnEN bit is cleared) before making any changes.
TIMER0_CTL_R &= 0xFE;
//2. Write the GPTM Configuration (GPTMCFG) register with a value of 0x0000.0004.
TIMER0_CFG_R= 0x00000004;
//3. In the GPTM Timer Mode (GPTMTnMR) register, write the TnCMR field to 0x1 and the TnMR field to 0x3.
TIMER0_TAMR_R= TIMER0_TAMR_R | 0x007;
//4. Configure the type of event that the timer captures by writing the TnEVENT field of the GPTM Control (GPTMCTL) register.
TIMER0_CTL_R = TIMER0_CTL_R & 0xFFFFFFF3;
//5. If a prescaler is to be used, write the prescale value to the GPTM Timer n Prescale Register (GPTMTnPR).
//no prescaler for now
//6. Load the timer start value into the GPTM Timer n Interval Load (GPTMTnILR) register.
TIMER0_TAILR_R = 0xFF;
//7. If interrupts are required, set the CnEIM bit in the GPTM Interrupt Mask (GPTMIMR) register.
//no interrupts required
//8. Set the TnEN bit in the GPTM Control (GPTMCTL) register to enable the timer and start counting.
TIMER0_CTL_R= TIMER0_CTL_R & 0x00000001;
TIMER0_CTL_R |= 0x01;
//9. Poll the CnERIS bit in the GPTMRIS register or wait for the interrupt to be generated (if enabled). In both cases,
//the status flags are cleared by writing a 1 to the CnECINT bit of the GPTM Interrupt Clear (GPTMICR) register.
//The time at which the event happened can be obtained by reading the GPTM Timer n (GPTMTnR) register.
/*In Input Edge Timing mode, the timer continues running after an edge event has been detected,
but the timer interval can be changed at any time by writing the GPTMTnILR register. The change
takes effect at the next cycle after the write.*/
}
答案 0 :(得分:0)
我的portb初始化出现了问题我使用了tivaware用于该部分并且它现在完全正常,因为在PB6上放置高电平它将当前定时器值传递给另一个寄存器 还要注意,当向上计数时,定时器计数到TAIL_R寄存器中初始化的值,如果你想复位定时器,你需要写入值,你想要在TAV_R寄存器中开始定时器 祝大家好运