微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 按 Technical Reference Manual 中 P1099 步骤配置CC2640 PWM,程序执行到TimerDisable()就死掉了,请问这是为什么?

按 Technical Reference Manual 中 P1099 步骤配置CC2640 PWM,程序执行到TimerDisable()就死掉了,请问这是为什么?

时间:10-02 整理:3721RD 点击:

想用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呢?

谢谢回复!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top