不好意思,又来叨扰了,我基于ucos2写了一个程序,实现PC12中断输入,控制PC13灯亮一分钟,但是实际上并不好使,还请大家帮我分析一下,给我一点建议
#include "includes.h"
/************************优先级定义**************************************/
#define task_start_prio 4
/**********************堆栈大小定义**************************************/
#define task_start_stack_size 80
static OS_STK task_start_stack[task_start_stack_size];
/************************主函数******************************************/
int main(void)
{
HAL_Init();
gpio_init();
BSP_Init();
OSInit();
OSTaskCreate(task_start,(void *)0,(OS_STK *)&task_start_stack[task_start_stack_size-1],task_start_prio);
OSStart();
return 0;
}
/***********************初始化外设**************************************/
void gpio_init(void)
{
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_Initstruct_pc13;
GPIO_Initstruct_pc13.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initstruct_pc13.Pin=GPIO_PIN_13;
GPIO_Initstruct_pc13.Pull=GPIO_PULLUP;
GPIO_Initstruct_pc13.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initstruct_pc13);
}
void exti_init(void)
{
__HAL_RCC_SYSCFG_CLK_ENABLE();
GPIO_InitTypeDef GPIO_Initstruct_pc12;
GPIO_Initstruct_pc12.Mode=GPIO_MODE_IT_RISING;
GPIO_Initstruct_pc12.Pin=GPIO_PIN_12;
GPIO_Initstruct_pc12.Pull=GPIO_PULLDOWN;
GPIO_Initstruct_pc12.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initstruct_pc12);
}
void nvic_init()
{
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,15);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
/************************建立任务***************************************/
void task_start (void *p_arg)
{
(void)p_arg;
{
while(1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}
}
}
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
OSIntEnter();
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
OSTimeDlyHMSM(0,1,0,0);
OSIntExit();
}
/**********************************************************************/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
谢谢,可是我在主函数里调用了之后,还是没有效果是怎么回事呢
你的代码看不到的函数信息太多了,没法判断。
只能说建议的调试思路是:一小个功能一小个功能这样子来,你所有的东西整在一起排错就很困难了。
你先把系统和外部中断功能分开来调,你现在调好系统了,那在裸机里面有没有调好外部中断的功能?如果两个功能分开调都ok了再合到一起发现不行,那么问题就很清楚,就是移植的时候出错,这时候再思考为什么UCOS系统下怎么实现外部中断。
真的很不好意思,又来麻烦了,我在裸机里面调试成功了,ucos里面的中断调用也是按照格式写的,但是还是进不去中断。不知道,你能不能受累给分析一下呢。这个是中断函数的代码,void EXTI15_10_IRQHandler()
{
OSIntEnter();
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
OSIntExit();
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_Delay(100000);//这个函数是我重写的,已经验证没有问题。
}
真的很谢谢你。
一周热门 更多>