[英]Question about a timer and state machine (timerCallback)
我對 C 和一般的嵌入式系統非常陌生,所以我的問題可能有一個明顯的答案,但我不知道在這里做什么,而且我們的教師/學校 (SNHU) 的解釋非常模糊。
每 500000 秒給你的 state 機器打電話這是我不明白的部分(我真的不知道定時器是如何工作的,TI header 文件對此解釋得很差)。
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
/* Driver configuration */
#include "ti_drivers_config.h"
// Include the Timer
#include <ti/drivers/Timer.h>
int btnPress = 0;
int timerCount = 0;
void timerCallback(Timer_Handle myHandle, int_fast16_t status)
{
}
void initTimer(void)
{
Timer_Handle timer0;
Timer_Params params;
Timer_init();
Timer_Params_init(¶ms);
params.period = 1000000;
params.periodUnits = Timer_PERIOD_US;
params.timerMode = Timer_CONTINUOUS_CALLBACK;
params.timerCallback = timerCallback;
timer0 = Timer_open(CONFIG_TIMER_0, ¶ms);
if (timer0 == NULL) {
/* Failed to initialized timer */
while (1) {}
}
if (Timer_start(timer0) == Timer_STATUS_ERROR) {
/* Failed to start timer */
while (1) {}
}
}
void morseCodeSOS() {
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(3 * 500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(3 * 500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
usleep(7 * 500000);
}
void morseCodeOK() {
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(3 * 500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
usleep(500000);
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
usleep(1500000);
GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
usleep(7 * 500000);
}
/*
* ======== gpioButtonFxn0 ========
* Callback function for the GPIO interrupt on CONFIG_GPIO_BUTTON_0.
*
* Note: GPIO interrupts are cleared prior to invoking callbacks.
*/
void gpioButtonFxn0(uint_least8_t index)
{
/* Toggle an LED */
// GPIO_toggle(CONFIG_GPIO_LED_0);
btnPress = 1;
}
/*
* ======== gpioButtonFxn1 ========
* Callback function for the GPIO interrupt on CONFIG_GPIO_BUTTON_1.
* This may not be used for all boards.
*
* Note: GPIO interrupts are cleared prior to invoking callbacks.
*/
void gpioButtonFxn1(uint_least8_t index)
{
/* Toggle an LED */
// GPIO_toggle(CONFIG_GPIO_LED_1);
btnPress = 0;
}
enum morseCodeMsg {BTN_Init, BTN_SOS, BTN_OK} BTN_State;
// Create a state machine that checks for a button press interrupt (Call every 500,000
microseconds)
// If the button hasn't been pressed, execute the SOS message continuously.
// If the button has been pressed, finish SOS message, then signal OK message.
void switchStates() {
while(1) {
switch(BTN_State) {
case BTN_Init:
BTN_State = BTN_SOS;
btnPress = 0;
morseCodeSOS();
break;
case BTN_SOS:
if (btnPress == 0){
morseCodeSOS();
}
else if (btnPress == 1) {
morseCodeOK();
}
break;
case BTN_OK:
if (btnPress == 0) {
morseCodeSOS();
}
else if (btnPress == 1) {
morseCodeOK();
}
break;
default:
BTN_State = BTN_Init;
break;
}
}
}
/*
* ======== mainThread ========
*/
void *mainThread(void *arg0)
{
/* Call driver init functions */
GPIO_init();
/* Configure the LED and button pins */
GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig(CONFIG_GPIO_BUTTON_0, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
/* Turn on user LED */
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
/* Install Button callback */
GPIO_setCallback(CONFIG_GPIO_BUTTON_0, gpioButtonFxn0);
/* Enable interrupts */
GPIO_enableInt(CONFIG_GPIO_BUTTON_0);
/*
* If more than one input pin is available for your device, interrupts
* will be enabled on CONFIG_GPIO_BUTTON1.
*/
if (CONFIG_GPIO_BUTTON_0 != CONFIG_GPIO_BUTTON_1) {
/* Configure BUTTON1 pin */
GPIO_setConfig(CONFIG_GPIO_BUTTON_1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
/* Install Button callback */
GPIO_setCallback(CONFIG_GPIO_BUTTON_1, gpioButtonFxn1);
GPIO_enableInt(CONFIG_GPIO_BUTTON_1);
switchStates();
}
return (NULL);
}
我很確定我的 state 機器和一般的 morseCode 函數並不理想,但它們適用於我正在嘗試做的事情。 我只是不知道如何使用 timerCallback function 或 initTimer 來實現計時器。 我什至不知道他們都在做什么。 如果有人可以提供幫助,那將不勝感激。
我認為您只需將 params.period 的值更改為 5000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.