学院网站建设管理办法上海申远建筑设计有限公司
web/
2025/10/2 2:31:48/
文章来源:
学院网站建设管理办法,上海申远建筑设计有限公司,汕头seo关键词,南宁网站seo文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数#xff1a;void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实… 文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实现及分析
1 代码的流程分析 2 代码的实现 库函数HAL_Init(void)分析
HAL_StatusTypeDef HAL_Init(void)
{/* Configure Flash prefetch, Instruction cache, Data cache */
#if (INSTRUCTION_CACHE_ENABLE ! 0U) //0U表示无符号整型 0 1U 表示无符号整型1 ~0U就是对无符号数0取反。__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE 允许指令缓存*/#if (DATA_CACHE_ENABLE ! 0U)__HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */#if (PREFETCH_ENABLE ! 0U)__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE *//* Set Interrupt Group Priority 中断优先级分组*/HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */HAL_InitTick(TICK_INT_PRIORITY); //初始化系统时钟/* Init the low level hardware 初始化底层硬件堆栈指针*/HAL_MspInit(); //使用HAL_Delay延时/* Return function status */return HAL_OK;
}Tip1:函数说明的格式
/****************
*函数名main
*函数的描述:通过中断实现按键的捕获
*输入参教:
*输出参数:
*返回值:
*图数作者:
*创建时间:
*更改说明:
*****************/Tip2:如何使用CMSIS的延时
HAL_Delay()系统延时的步骤 它的实现步骤如下 1.用变量获得系统时钟源计数器的值 2.获得要延迟时间的参数值 3.比较两者大小若时钟计数器的值大于要实现延迟的值就会困在循环里反之跳出循环延时完成。
/*** brief此函数提供最小延迟(以毫秒为单位)对变量递增。* note在默认实现中SysTick计时器是基准时间的来源。*它用于在固定的时间间隔生成中断其中uwTick是递增的。这个函数被声明为__weak在其他情况下会被覆盖实现在用户文件。*param Delay指定延迟时间长度单位为毫秒。*retval无*/
__weak void HAL_Delay(uint32_t Delay)
{uint32_t tickstart HAL_GetTick(); //获得起始时钟uint32_t wait Delay;/* Add a freq to guarantee minimum wait */if (wait HAL_MAX_DELAY) //#define HAL_MAX_DELAY 0xFFFFFFFFU1111 1111 1111 1111 1111 1111 1111 1111{// HAL_TICK_FREQ_1KHZ 1U,// HAL_TICK_FREQ_DEFAULT HAL_TICK_FREQ_1KHZwait (uint32_t)(uwTickFreq); //作用是给wait加1。HAL_TickFreqTypeDef uwTickFreq HAL_TICK_FREQ_DEFAULT; /* 1KHz */}while((HAL_GetTick() - tickstart) wait) //当前时钟-起始时钟的值小于wait(delay)就重复操作直到计时结束{}
}GetTick函数原型
/**调用这个函数是为了增加一个全局变量“uwTick”用作申请时基。
在默认实现中这个变量每1ms增加一次在SysTick ISR。
这个函数被声明为__weak在其他情况下会被覆盖实现在用户文件。
* retval无*/
__weak void HAL_IncTick(void)
{uwTick uwTickFreq;
}/**
* brief提供以毫秒为单位的tick值。
这个函数被声明为__weak在其他情况下会被覆盖实现在用户文件。
retval tick value*/
__weak uint32_t HAL_GetTick(void)
{return uwTick;
}对于裸机程度没有其他的隐蔽的东西自己好好分析还是可以理清程序运行的细节及时序关系。遵守的原则 1、尽量不要在主程序中使用死等的延时二、每个子程序也可以叫任务吧的查询频率要大于主程序运行的时间。比如ad采样100ms采样一次那么主程序一定要在100ms以内执行完毕。 死等的延时可以是us级别的时序性较高的地方大的延时就使用定时器。
stm32f407_intr_handle.c解析
中断处理函数void EXTI4_IRQHandler
根据startup_stm32f407xx.s中对于handler的描述编写相应的断点处理函数
__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault HandlerDCD BusFault_Handler ; Bus Fault HandlerDCD UsageFault_Handler ; Usage Fault HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD DebugMon_Handler ; Debug Monitor HandlerDCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler执行函数HAL_GPIO_EXTI_IRQHandler(KEY0_PIN)调用stm32f4xx_hal_gpio.c中的void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)函数的定义为
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected *///#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI-PR (__EXTI_LINE__))//__EXTI_LINE__ specifies the EXTI line flag to check.if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) ! RESET) // RESET 0Ustm32f4xx.h,表明检测到了中断{/*** brief Clears the EXTIs line pending bits.* param __EXTI_LINE__ specifies the EXTI lines to clear.* This parameter can be any combination of GPIO_PIN_x where x can be (0..15)* retval None*/__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
}回调函数在HAL_GPIO_EXTI_Callback在HAL中未明确实现(弱声明需要自己构造实现函数。 原型为
/*** brief EXTI line detection callbacks.* param GPIO_Pin Specifies the pins connected EXTI line* retval None*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
}在key.c中对回调函数进行了重写
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin KEY0_PIN) // KEY0_PIN被按下{Led_Ctrl(LED0_PIN_ROW, LED0_PIN, LED_ON); //执行点灯操作}
}本节中uint16_t Detect_key(uint16_t key_pin)未使用。
调试流程
在中断处理函数和uwTick自加操作函数处设立中断进行调试
void EXTI4_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(KEY0_PIN);
}void SysTick_Handler(void)
{HAL_IncTick(); //uwTick自加操作 uwTick uwTickFreq;}软件模拟调试
采用软件模拟方式进入调试停在了main函数底下的LED0_Init()函数
运行出现错误*** error 65: access violation at 0x40023830 : no ‘write’ permission 由于没有指定相应的cpu 解决方法
1 新建cpu.ini,写入:
map 0x40000000,0x400FFFFF read write2 将cpu.ini添加入debug
两种代码的比较
中断模式对CPu占用率更小等待时间更短减小CPU占有率
课后作业:
1:预习缤程手册关于USART控制器的描述第30章 2:通过中断的方式实现一个程序,要求按下KEY1以后:让LED1间隔0.5S闪烁,并持续5S后关闭,实现代码并在板调试
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85378.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!