按 Technical Reference Manual 中 P1099 步骤配置CC2640 PWM,程序执行到TimerDisable()就死掉了,请问这是为什么?
想用CC2640的PWM,按手册中的说明去配置,但是执行到TimerDisable()和TimerEnable(),程序都会死掉,然后IAR出现以下错误:
Tue Aug 18, 2015 14:06:12: The stack pointer for stack 'CSTACK' (currently 0x20001BC8) is outside the stack range (0x20003FE0 to 0x200043E0)
我修改了堆栈大小也没有用,改到1024、2048、3072还是有以上错误,请问TI这是为什么?
我的PWM初始化函数如下:
void cc2640_pwm_init(void)
{
PIN_Config pwmPinTable[5];
uint32_t i = 0;
pwmPinTable[i++] = Board_PWM_0 | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH;
pwmPinTable[i++] = Board_PWM_1 | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH;
pwmPinTable[i++] = Board_PWM_2 | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH;
pwmPinTable[i++] = Board_PWM_3 | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH;
pwmPinTable[i++] = PIN_TERMINATE;
/* Open and assign pins through pin driver */
hPin = PIN_open(&pinState, pwmPinTable);
/* Set IO muxing for the PWM pins */
PINCC26XX_setMux(hPin, Board_PWM_0, IOC_PORT_MCU_PORT_EVENT0);
PINCC26XX_setMux(hPin, Board_PWM_1, IOC_PORT_MCU_PORT_EVENT1);
PINCC26XX_setMux(hPin, Board_PWM_2, IOC_PORT_MCU_PORT_EVENT2);
PINCC26XX_setMux(hPin, Board_PWM_3, IOC_PORT_MCU_PORT_EVENT3);
TimerDisable(GPT0_BASE, TIMER_BOTH); //执行到这里程序就死掉了
TimerConfigure(GPT0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM);
TimerLoadSet(GPT0_BASE, TIMER_BOTH, 0xC350);
TimerMatchSet(GPT0_BASE,TIMER_BOTH, 0x411A);
TimerLevelControl(GPT0_BASE, TIMER_BOTH,true);
TimerEnable(GPT0_BASE, TIMER_BOTH);
}
猜猜你是谁,
安装最新的SDK后,打开file:///C:/TI/tirtos_simplelink_2_13_00_06/docs/tirtos_User_Guide.pdf
里面有PWM指导和示例代码。
这部分应该是讲 PWM.h 和 PWM.c 这两个文件中 API 的格式和使用方法,但是 TI 并没有提供CC2640 PWM的驱动程序实现,这部分是不是要自己写代码实现?关于这部分的内容,个人看其他TI提供的驱动使用中已经知晓了使用方法,然后看了看LCD的驱动实现,理清了下,每个API的实现都涉及4、5个.C文件,函数间的调用关系有7、8层,我觉得好复杂的,且有大量指针运用,而不是传统驱动一个.c一个.h文件的样子,对于工作时间才1年的我难度太大了,我觉得这个驱动我根本实现不了。。。
猜猜你是谁,
小伙子不要着急,仔细看看guide和TI的RTOS架构。
只要调用这些API就行了,因为底层的寄存器配置RTOS已经帮你做好了,这些API就是让你方便调用的。
猜猜你是谁,
或者你参考一下这个例子,用PIN和timer去实现,比较简单。
https://e2e.ti.com/support/wireless_connectivity/f/538/p/405132/1435673#1435673
好帖子,收藏了
Yan,
谢谢你的回复,这个链接中的代码我试过了,是可以用的PWM,不过这是通过软件翻转IO口的方式,对于时间精度要求较高的就不行了,不是硬件PWM的方式,不行呐....但是在那个链接看到一句回复如下:
The GPTimers are not enabled by default so writing or reading from the timer will trigger a bus faul
是不是我之前调试出现的堆栈溢出的错误就是这个原因引起的,但是本身堆栈是足够的,这个问题我碰到好几次了,是这个原因吗?那应该如何enable GPTimes呢?
谢谢回复!