完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
|
|
裸机时启动代码中带有中断入口函数,函数名一致就能完成中断调用。但是rt thread的中断机制和裸机时不一样,没法直接判断pwm中断源。
|
|
|
|
|
|
你确定裸机下的中断函数,在rt-thread下 即使开启中断,也无法进入中断函数?
你忘记了rt-thread也是靠SysTick_Handler中断来计数的,中断是可以用的 |
|
|
|
|
|
是我理解错了,能进入中断,应该是进了之后出不来了。请问在使用rt thread时进入中断和出中断时只要加入rt_interrupt_enter()和rt_interrupt_leave()就可以吗?
|
|
|
|
|
|
参考SysTick_Handler
void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); HAL_IncTick(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } 就是不加rt_interrupt_enter和rt_interrupt_leave,中断也是可以正常返回的 调用 rt_interrupt_enter() 函数,作用是把全局变量 rt_interrupt_nest加 1,用它来记录中断嵌套的层数, |
|
|
|
|
|
以下代码在裸机环境中可以正常运行,预期结果和代码相符。
但在rt thread环境中,调用HAL_TIM_PWM_Start_IT(&htim12,TIM_CHANNEL_1);,以中断方式启动pwm后就会卡死在启动文件中的b Infinite_Loop处,在settings已经启用pwm和hwtimer,也在board.h做好宏定义,在stm32xxxx_hal_config.h中解除注释了。要在rt thread中使用中断回调函数是还有哪些步骤遗漏了吗? //board.c 中复制的代码 TIM_HandleTypeDef htim12; void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM12) { /* USER CODE BEGIN TIM12_MspInit 0 */ /* USER CODE END TIM12_MspInit 0 */ /* TIM12 clock enable */ __HAL_RCC_TIM12_CLK_ENABLE(); /* TIM12 interrupt Init */ HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 2, 0); HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); /* USER CODE BEGIN TIM12_MspInit 1 */ /* USER CODE END TIM12_MspInit 1 */ } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(timHandle->Instance==TIM12) { /* USER CODE BEGIN TIM12_MspPostInit 0 */ /* USER CODE END TIM12_MspPostInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM12 GPIO Configuration PB14 ------> TIM12_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_TIM12; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN TIM12_MspPostInit 1 */ /* USER CODE END TIM12_MspPostInit 1 */ } } void MX_TIM12_Init(void) { /* USER CODE BEGIN TIM12_Init 0 */ /* USER CODE END TIM12_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM12_Init 1 */ /* USER CODE END TIM12_Init 1 */ htim12.Instance = TIM12; htim12.Init.Prescaler = 168; htim12.Init.CounterMode = TIM_COUNTERMODE_UP; htim12.Init.Period = 1000; htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim12) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim12) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim12, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM12_Init 2 */ /* USER CODE END TIM12_Init 2 */ HAL_TIM_MspPostInit(&htim12); } //主函数的程序 #include #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #include #include "stm32f4xx.h" //#include #include #define PWM_DEV_NAME "pwm12" /* PWM 设备名称 */ #define pwm_channel 1 /* PWM 通道 */ extern void MX_TIM12_Init(void); extern TIM_HandleTypeDef htim12; void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { rt_interrupt_enter(); if(htim->Instance==TIM12) { if(count++>5000){ HAL_TIM_PWM_Stop_IT(&htim12,TIM_CHANNEL_1); // rt_pwm_disable(pwm_dev, pwm_channel); } } rt_interrupt_leave(); } int main(void) { MX_TIM12_Init(); HAL_TIM_PWM_Start_IT(&htim12,TIM_CHANNEL_1); } |
|
|
|
|
|
你是准备用rt-thread 的pwm框架还是要用自己裸机的程序?别搞混了,如果想使用裸机程序实现,就无需定义#define BSP_USING_PWM1
|
|
|
|
|
|
谢谢!问题已解决,rtt的框架和裸机的程序可以联合跑。之前失败的原因是因为cubemx自动生成的一些代码,但是rtt中没有,自动生成工程中的代码补齐到rtt中就可以了。
|
|
|
|
|
|
821 浏览 0 评论
5845 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2764 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3095 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
32921 浏览 11 评论
73485 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 17:01 , Processed in 0.866753 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号