S32K144之SDK版:FTM定时器(测试打印系统信息)
生活随笔
收集整理的這篇文章主要介紹了
S32K144之SDK版:FTM定时器(测试打印系统信息)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
修改FreeRTOS代碼
創(chuàng)建任務(wù)
?編寫(xiě)任務(wù)函數(shù)
添加定時(shí)器模塊
配置定時(shí)器模塊?初始化,并注冊(cè)中斷函數(shù)
?編寫(xiě)中斷函數(shù)
打印下系統(tǒng)信息
打印FreeRTOS系統(tǒng)信息現(xiàn)象
Freertos---SDK修改(和修改代碼一個(gè)效果)
?
修改FreeRTOS代碼
main.c中添加 uint8_t CPU_RunInfo[400]; volatile uint32_t CPU_RunTime;FreeRTOSconfig.h中修改 /* Run time and task stats gathering related definitions. */ #define configGENERATE_RUN_TIME_STATS 0 #define configUSE_TRACE_FACILITY 0 #define configUSE_STATS_FORMATTING_FUNCTIONS 0///修改為 /* Run time and task stats gathering related definitions. */ #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1extern volatile uint32_t CPU_RunTime; #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0ul) #define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime創(chuàng)建任務(wù)
/*創(chuàng)建任務(wù)*/ void rtos_start(void) {xTaskCreate( (TaskFunction_t ) LED1_Task,( char * ) "LED1_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 14,(TaskHandle_t *) NULL ) ;xTaskCreate( (TaskFunction_t ) LED2_Task,( char * ) "LED2_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 14,(TaskHandle_t *) NULL ) ;xTaskCreate( (TaskFunction_t ) LED3_Task,( char * ) "LED3_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 14,(TaskHandle_t *) NULL ) ;xTaskCreate( (TaskFunction_t ) LED4_Task,( char * ) "LED4_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 14,(TaskHandle_t *) NULL ) ;xTaskCreate( (TaskFunction_t ) main_Task,( char * ) "main_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 14,(TaskHandle_t *) NULL ) ;vTaskStartScheduler();}?編寫(xiě)任務(wù)函數(shù)
void LED1_Task( void *pvParameters ) {(void) pvParameters;uint8_t count = 0;while(1){count++;if(20 == count){count = 0;u1_printf("LED1_Task running & !\r\n");}PINS_DRV_TogglePins(PTD, 1 << 0);vTaskDelay(800);} }void LED2_Task( void *pvParameters ) {(void) pvParameters;uint8_t count = 0;while(1){count++;if(20 == count){count = 0;u1_printf("LED2_Task running & !\r\n");}PINS_DRV_TogglePins(PTD, 1 << 1);vTaskDelay(400);} }void LED3_Task( void *pvParameters ) {(void) pvParameters;uint8_t count = 0;while(1){count++;if(20 == count){count = 0;u1_printf("LED3_Task running & !\r\n");}PINS_DRV_TogglePins(PTD, 1 << 15);vTaskDelay(200);} }void LED4_Task( void *pvParameters ) {(void) pvParameters;uint8_t count = 0;while(1){count++;if(20 == count){count = 0;u1_printf("LED4_Task running & !\r\n");}PINS_DRV_TogglePins(PTD, 1 << 16);vTaskDelay(100);} }TaskHandle_t TEST_task_handler;/*創(chuàng)建一個(gè)任務(wù)并刪除自身*/ void TEST_Task( void *pvParameters ) {(void) pvParameters;taskENTER_CRITICAL();u1_printf("test Task running & delete!\r\n");vTaskDelete(TEST_task_handler);taskEXIT_CRITICAL(); }/*主循環(huán)*/ void main_Task( void *pvParameters ) {(void) pvParameters;uint32_t pinstate;ftm_state_t ftmStateStruct;/* 初始化FTM模塊 */FTM_DRV_Init(INST_FLEXTIMER_MC1, &flexTimer_mc1_InitConfig,&ftmStateStruct);/* 配置并使定時(shí)器能溢出中斷 */INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn,&ftmTimerISR,(isr_t*) 0U);INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn);/* 初始化計(jì)數(shù)器 */FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, &flexTimer_mc1_TimerConfig);FTM_DRV_CounterStart(INST_FLEXTIMER_MC1);while(1){pinstate = KEY_Proc (0);if(pinstate ==BTN1_PRES ){xTaskCreate( (TaskFunction_t ) TEST_Task,( char * ) "TEST_Task",(const configSTACK_DEPTH_TYPE) configMINIMAL_STACK_SIZE ,(void * ) NULL,(UBaseType_t ) 1,(TaskHandle_t *) TEST_task_handler ) ;taskENTER_CRITICAL();Printf_CPU_RunInfo();taskEXIT_CRITICAL();}vTaskDelay(20);} }添加定時(shí)器模塊
配置定時(shí)器模塊初始化,并注冊(cè)中斷函數(shù)
ftm_state_t ftmStateStruct;/* 初始化FTM模塊 */FTM_DRV_Init(INST_FLEXTIMER_MC1, &flexTimer_mc1_InitConfig,&ftmStateStruct);/* 配置并使定時(shí)器能溢出中斷 */INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn,&ftmTimerISR,(isr_t*) 0U);INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn);/* 初始化計(jì)數(shù)器 */FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, &flexTimer_mc1_TimerConfig);FTM_DRV_CounterStart(INST_FLEXTIMER_MC1);?編寫(xiě)中斷函數(shù)
void ftmTimerISR(void) {//ftm周期中斷 50us進(jìn)來(lái)一此CPU_RunTime++;FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1, (uint32_t)FTM_TIME_OVER_FLOW_FLAG); //清除FTM狀態(tài)標(biāo)志位 }打印下系統(tǒng)信息
//打印CPU信息 void Printf_CPU_RunInfo() {uint32_t GetFrequency ;uint32_t ConvertFreqToPeriodTicks ;memset(CPU_RunInfo,0,400); //信息緩沖區(qū)清零vTaskList((char *)&CPU_RunInfo); //獲取任務(wù)運(yùn)行時(shí)間信息u1_printf("------------------------------------------------\r\n");u1_printf("Name Status Priority Residue Number\r\n");u1_printf("%s", CPU_RunInfo);u1_printf("------------------------------------------------\r\n\n");memset(CPU_RunInfo,0,400); //信息緩沖區(qū)清零vTaskGetRunTimeStats((char *)&CPU_RunInfo);u1_printf("Task name Run count usage\r\n");u1_printf("%s", CPU_RunInfo);u1_printf("------------------------------------------------\r\n\n");GetFrequency = FTM_DRV_GetFrequency(INST_FLEXTIMER_MC1);ConvertFreqToPeriodTicks = FTM_DRV_ConvertFreqToPeriodTicks(INST_FLEXTIMER_MC1,20000);u1_printf("GetFrequency = %d\r\n\n",GetFrequency);u1_printf("ConvertFreqToPeriodTicks = %d\r\n\n",ConvertFreqToPeriodTicks); }打印FreeRTOS系統(tǒng)信息現(xiàn)象
?參考資料14. CPU使用率統(tǒng)計(jì) — FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)指南—基于STM32 文檔 (embedfire.com)
總結(jié)
以上是生活随笔為你收集整理的S32K144之SDK版:FTM定时器(测试打印系统信息)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: k60的FTM模块:配置电机、编码器、舵
- 下一篇: 数据结构练习题——图(含应用题)