在HAL库中的微妙数据库隔离级别 详解的延迟怎么弄

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
比如说使用TIM2定时器定时器,用cubemx生成代码后,在stm32f0xx_it.c中有
* @brief This function handles TIM2 global interrupt.
void TIM2_IRQHandler(void)
/ USER CODE BEGIN TIM2_IRQn 0 /
/ USER CODE END TIM2_IRQn 0 /
HAL_TIM_IRQHandler(&htim2);
/ USER CODE BEGIN TIM2_IRQn 1 /
/ USER CODE END TIM2_IRQn 1 /
而AL_TIM_IRQHandler(&htim2)中有
/ TIM Update event /
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
if(__HAL_TIM_GET_ITSTATUS(htim, TIM_IT_UPDATE) !=RESET)
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
HAL_TIM_PeriodElapsedCallback(htim);
看到有的资料写HAL_TIM_PeriodElapsedCallback(htim);是用户接口
那前面的几个函数不都叫中断调用函数吗?他们是什么关系?我要实现的代码到底写在哪里??
HAL_TIM_PeriodElapsedCallback(htim);是中端的回调函数,
函数HAL_TIM_IRQHandler(&htim2);的内部包含了这个回调,用keil编译后查看函数结构就能发现
那修改callback函数或者IRQHandler函数有差别吗?或者说他们各有什么作用?
该问题目前已经被锁定, 无法添加新回复
浏览: 6741
关注: 4 人还没有帐号? 赶紧
用户版块帖子
用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯
UID:832715
在线时间3010小时
M币2152专家2
初学者做个东西不容易,发个帖子记录一下制作过程,同时也给大家一些参考吧……特别感谢坛友 桃源客 和 yanzeyuan 我分别用了他俩的农历计算程序和GMT时区转换程序。做这个时钟的最初想法是因为办公室新装修换了桌子,没有台灯,所以想着做个可以用遥控器调光的台灯。说是台灯,实际上就是用单片机控制一条12v的led灯带,灯带贴在了格挡的铝合金框架上。 起初用的是四块钱的stm8s103f3,无奈io比较少,没法带我手头的几个屏幕。不过倒是通过这个小东西学了学红外解码、pwm调光和stm8的eeprom操作。帖子的最后会贴上源代码。 这是最初用stm8做的版本灯做完之后有同学感觉不错,也想让我给做一个,再加上最近刚刚学了学HAL库函数,所以琢磨着弄个带屏幕的调光台灯。手里有好几个网友送的19264屏,只显示亮度的话着实浪费了,加个时钟功能吧,从此开始了一个多星期的折腾之路……先看看最终的成品图吧: 先续……
用遥控器可以调国际时间,只做了几个常看的,夏令时还没来得及搞… 屏幕最上方用来显示日期,不过空间实在不足,只好做成滚动的了。 电路就是在洞洞板上搭的,挺容易的就不画电路图了。左侧带散热的是7805线性稳压,中间八脚的是从笔记本主板上拆下的mos管,这小东西真不错,vgs(th)很低而且内阻也很小,带3A负载不怎么发热。屏幕引脚掰弯,斜着插到座子中。红外接收头藏在屏幕下边。右边就是24l01了。说到24l01,我发现我手中的几个都是假冒的,而且淘宝上销量靠前的似乎也没有正品,大家可以到下面的链接中去看看:=740) window.open('http://s.zeptobars.ru/Nordic-NRF24L01P-cmp.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯"> 最下面的对比图中右侧的是正品。发送端用的是剪线的三块钱的gps模块,一个stm8s单片机和一个24l01模块,代码也在最后。以前用stm32都是用的标准库函数进行开发,这次打算用一下最新的stm32cube,所以还要学习一下hal库函数。首先就是对stm32的片上资源什么的配置一番。 打开stm32cube,new project,选好对应的芯片,默认就会进入到pinout的配置中。左侧的树状图就是各种片上资源以及中间件了,可以点开进行详细配置。右侧也可以单独对某一管脚进行配置。=740) window.open('/3a35b2b1e9.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">=740) window.open('/1d00e8e3f3f7.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯"> 首先配置RCC HSE为晶振,然后配置SYS debug选项为串行方式,这样的话不影响下次程序下载,保留PA14 PA13的调试功能。=740) window.open('/a463e15c0b4c.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯"> 考虑到以后开发可能还需要用串口调试什么的,所以打开usb功能,用usb的模拟串口调试。=740) window.open('/11814/ba433bf3c0f444e1.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">核心板上的pa0-pa7是紧挨着的,所以在这里我把这几个管脚设置为数据接口。再打开spi1功能,引脚自动映射到pb port上。这里我发现有个问题,pa15既可以作为TIM2CH1、SPI1NSS,也可以作为JTDI接口,如果配置成串行调试模式,失能SPI1的硬件NSS理论上是可以作为TIM2的第一通道的,但无论如何调整代码,这个引脚总是输出低电平,不知何故。以致最后我把pwm输出调整为PB6 TIM4CH1。TIM1CH1设置为红外捕获通道。24l01有一个中断引脚,这里将PB15配置为外部中断,下降沿有效。根据剩余的管脚情况,开启了adc1的第9通道作为电压检测,然后配置其他的液晶控制脚。不得不吐槽这个三片选的19264真的占用太多io了,看看人家建行的优盾,spi接口方便得很呐!=740) window.open('/c048f43fe3b5.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">接下来打开第二个选项卡对时钟进行配置。input fequency设置为8,主时钟设置为HSE,软件自己带有纠错优化功能,这里也就不考虑什么节能不节能了,直接最高频率了……=740) window.open('/1f502d3d7d2.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">这里还出现了一个小插曲,第一次做的时候不知何故,apb2 timer clock竟然到了144mhz,手册上不是说当apb2的分频系数不为一的时候,timer的倍频系数才为2么?不应该出现这种情况啊!而且实际我跑了一下就是这么快!莫非还能超频100%??重新新建工程解决此问题…=740) window.open('/afdaabae0b7.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">进入到第三个选项卡对外设和中间件进行详细配置。 =740) window.open('/e9c7ea972de3.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">根据24l01的要求,spi速度不能超过10mbps,所以详细的spi配置如图。=740) window.open('http://pt./large/87c9773cgw1f9spo9e8gtj20if0iqdjt.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯"> =740) window.open('/11814/ef012d5fdaa3ba72.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">adc这部分可以用一下dma传输,开启第9通道和温度通道,模式为连续采样。手册中貌似对温度的采样周期有一些要求,所以我把采样周期设置成最大。DMA通道开启,从外设到内存,模式为circular。=740) window.open('http://pt./large/87c9773cgw1f9sq1jjqk7j20jw0fjgqy.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">这是gpio的详细配置情况=740) window.open('http://pt./large/87c9773cgw1f9sq25wrrgj20jw0fjac9.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">因为红外接收头要求数据口要有大于20k的上拉电阻,为了节省一枚电阻,这里将pa8配置为带上拉的输入模式。=740) window.open('http://pt./large/87c9773cgw1f9spywc4y1j20i30iegqi.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">在NVIC中开启需要用到的中断。=740) window.open('http://pt./large/87c9773cgw1f9sq4a34hyj20if0haq6j.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">TIM1CH1作为红外解码的输入捕获,开启下降沿捕获功能,根据NEC的红外协议,这里将预分频值设为7199可以得到100us的最小捕获周期,正好用来判断红外指令。=740) window.open('http://pt./large/87c9773cgw1f9sq86zw6tj20if0dr415.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">TIM2每2ms产生中断一次,用来进行计数以及亮度调整等杂七杂八的功能。=740) window.open('http://pt./large/87c9773cgw1f9sq9rc3u3j20if0f2ad9.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">这是TIM4的详细配置,用来产生PWM驱动MOS管控制led灯。这里预分频系数为23,ARR寄存器值为99,因此pwm频率为72,000/24/100=30khz。可以调节100级亮度并且人眼肯定感觉不到闪啦!=740) window.open('http://pt./large/87c9773cgw1f9sqd9q2vkj20db0drmzm.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">usb中间件也可以自己进行配置,一般默认即可。点击工具栏上的小齿轮就可以生成工程代码了。=740) window.open('http://pt./large/87c9773cgw1f9sqei49qhj20iw0i2dir.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">=740) window.open('http://pt./large/87c9773cgw1f9sqemndcaj20iw0i2adm.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">我用的开发环境是MDK v5,给自己的项目起个名字。在code generator中,我建议勾上only copy the necessary library files 以及 generate peripheral initialization...这两个选项,减少空间占用还可以让代码更清晰。 代码生成完毕后点击open project就可以直接用mdk打开工程文件了。=740) window.open('http://pt./large/87c9773cgw1f9sqlezczrj20610fvdh9.jpg');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯" alt="用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯">main文件在application/user文件夹中。可以看到生成的工程非常规范,我们只需要在其中USER CODE BEGIN 和USER CODE BEGIN中间插入要写的代码即可,其余地方无需修改。可以一边写程序一边再用cubemx对芯片进行配置,不过只有在规定区域内修改程序,下次再用cubemx生成代码时才不会被删除…… main函数中已经包含了对各种外设进行配置的步骤了,但是开启PWM输出以及开启DMA传输还是需要手动添加的。定义一个数组用来保存ADC的数据:uint32_t ADC_Value[200];之后就可以开启DMA传输了:HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 200); DMA控制器会自动将采集到的ADC数据保存到数组中,因为是两个通道,所以偶数的是电压,奇数的是温度。写满200之后会自动从0开始。真是方便至极呀!再说说屏幕驱动。先前用stc的单片机驱动屏幕一切正常,但是同样的程序挪到stm32上就发现显示成乱码了,鼓捣了好长一段时间才悟出应该是stm32速度过快,数据没能正确地传到液晶模块中。所以在拉高管脚E之后加一个小延时再拉低才算正常。HAL库函数没有WriteByte函数了,所以需要操作寄存器了。原来标准库函数中是操作ODR寄存器,但是ODR寄存器会影响除数据脚以外的其他引脚,所以更好的方法是操作BSRR寄存器。操作BSRR寄存器可以在不影响其他引脚的情况下改变某一引脚的电平状态。这是写数据的函数:void lcd_send(uint8_t data)//以pa0-7为数据输出口{&&&&&&&&uint32_t dat,uc1;&&&&&&&&data = reverse8(data);&&&&&&&&uc1 = 0;&&&&&&&&dat = (~(uc1|data)&&16) | (uc1|data);&&&&&&&&GPIOA-&BSRR =}因为液晶接口的d7对应单片机的pa0而d0对应pa7,是完全颠倒过来的(不颠倒着放实在没地方了),所以还需要一个单字节按位逆序的函数:uint8_t reverse8( uint8_t c ){&&&& c = ( c & 0x55 ) && 1 | ( c & 0xAA ) && 1;&&&& c = ( c & 0x33 ) && 2 | ( c & 0xCC ) && 2;&&&& c = ( c & 0x0F ) && 4 | ( c & 0xF0 ) && 4;&&&&}液晶屏幕每8行为一页,一般的程序都是按页进行显示,我写了一个可以以任意行为起始进行显示的函数:void anyPosDisplay(uint8_t width, uint8_t height, uint8_t row, uint8_t column, uint8_t const *dp) {&&&&&&&& uint8_t ii,jj,page,height_page,&&&&&&&& //uint16_t n=0;&&&&&&&& page = row/8;//初始的页&&&&&&&& //page_addr = 0xb8 +//页地址&&&&&&&& residual = row%8;//错位的行数&&&&&&&& if(residual == 0)&&&&&&&& {&&&&&&&&&&&&&&&&&&height_page = (row+height)/8 -&&&&&&&&&&&&&&&& for(ii=0;ii&height_ii++)//页循环&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&& for(jj=0;jj&jj++)//列循环&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ChipSelect((jj + column)/64);//确定cs&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CmdWrite(0xb8 + page + ii);//写页地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CmdWrite(0x40 + (jj + column)%64);//写列地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DataWrite(*dp++);&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&& }&&&&&&&& }&&&&&&&& else&&&&&&&& {&&&&&&&&&&&&&&&& height_page = (row+height)/8 - page +1;//总共的页数&&&&&&&& //首先对页进行写入&&&&&&&& for(ii=0;ii&height_ii++)//页循环&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&& for(jj=0;jj&jj++)//列循环&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ChipSelect((jj + column)/64);//确定cs&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CmdWrite(0xb8 + page + ii);//写页地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CmdWrite(0x40 + (jj + column)%64);//写列地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (ii == 0)//第一个页面&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DataWrite(*dp++&&residual);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }//写数据&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(ii == height_page - 1)//最后一个页面&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DataWrite(*(dp++-width)&&(8-residual));&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else//中间页面&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DataWrite(*dp++&&residual | *(dp-width)&&(8-residual));&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&& }&& } } 由于空间有限,屏幕最上方的日期只能滚动显示,所以又写了一个字符部分显示的函数://针对滚动屏幕设计的显示函数,显示不完整的高度为8的整数倍的字符 //left为左边不显示的列数 void anyPosDisplayPart(uint8_t width, uint8_t height, uint8_t row, uint8_t column, uint8_t left,uint8_t const *dp) {&&&&&&&&&& for(uint8_t ii=0;ii&height/8; ii++)&&&&&&&& {&&&&&&&&&&&&&&&&anyPosDisplay(width - left, 8, ii*8, column, dp+left+ii*width);&&&&&&&& } } 再说说24l01吧。因为有两个接收端,接收的信号是一致的,所以不用开启自动应答。按照网上流行的程序发现只有上电的时候才能正常接收,复位不行:这是因为没有清楚24l01的状态寄存器。24l01还处于中断状态。后来又发现长按复位也不好用:这是因为在初始化的过程中没有清除RXFIFO导致FIFO写满,所以在初始化过程中还要清除FIFO。另外就是HAL库函数有同时写入读取SPI数据的函数,所以不要将写入和读取分开,否则接收的数据不完整。另外需要注意的地方就是HAL库不需要在单独的c文件中修改中断回调函数,只要根据中断类型,在main文件中重写对应的函数即可。比如24l01的外部中断回调函数:void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){&&&&&&&&if(GPIO_Pin == GPIO_PIN_15)&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RX_READY = NRF24L01_RxPacket(rxbuf,&chl);&&&&&&&&&&&&&&&&HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);&&&&&&&&&&&&&&&&RX_Mode();&&&&&&&&&&&&&&&&for(uint8_t i=0;i&6;i++)//对时间和日期进行处理&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&timeS[i] = rxbuf[i];&&&&&&&&&&&&&&&&&&&&&&&&dateS[i] = rxbuf[i+6];&&&&&&&&&&&&&&&&}&&&&&&&&}} 以及TIM1CH1的中断回调函数(红外解码):void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){&&&&&&&&if(htim-&Channel == HAL_TIM_ACTIVE_CHANNEL_1)&&&&&&&&{&&&&&&&&&&&&&&&&//HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);&&&&&&&&&&&&&&&&bu =&&HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);&&&&&&&&&&&&&&&&if(bu&130 & bu&140) {xx=0;}&&&&&&&&&&&&&&&&else if (bu&9 && bu&14){ ir[xx/8]&&=1;xx++;}&&&&&&&&&&&&&&&&else if (bu&17 && bu&27){ ir[xx/8]&&=1;ir[xx/8]|=0x80;xx++;}&&&&&&&&&&&&&&&&else if (bu&108 && bu&116) {lianfa=1;}&&&&&&&&&&&&&&&&if(xx==32){xx=0;irda_flag=1;}&&&&&&&&&&&&&&&&__HAL_TIM_SET_COUNTER(htim,0);&&&&&&&&}} 以红外中断为例,可以到stm32f1xx_it.c文件中找对应的函数:void TIM1_CC_IRQHandler(void){&&/* USER CODE BEGIN TIM1_CC_IRQn 0 */&&/* USER CODE END TIM1_CC_IRQn 0 */&&HAL_TIM_IRQHandler(&htim1);&&/* USER CODE BEGIN TIM1_CC_IRQn 1 */&&/* USER CODE END TIM1_CC_IRQn 1 */} 之后再go to definition of HAL_TIM_IRQHandler...可以看到相关代码:/* Capture compare 1 event */&&if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET)&&{&&&&if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET)&&&&{&&&&&&{&&&&&&&&__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);&&&&&&&&htim-&Channel = HAL_TIM_ACTIVE_CHANNEL_1;&&&&&&&&/* Input capture event */&&&&&&&&if((htim-&Instance-&CCMR1 & TIM_CCMR1_CC1S) != 0x00)&&&&&&&&{&&&&&&&&&&HAL_TIM_IC_CaptureCallback(htim);&&&&&&&&}&&&&&&&&/* Output compare event */&&&&&&&&else&&&&&&&&{&&&&&&&&&&HAL_TIM_OC_DelayElapsedCallback(htim);&&&&&&&&&&HAL_TIM_PWM_PulseFinishedCallback(htim);&&&&&&&&}&&&&&&&&htim-&Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;&&&&&&}&&&&}&&} 第一行已经帮我们清楚中断标志位了,再看回调函数:HAL_TIM_IC_CaptureCallback(htim),用 go to definition功能可以看到它在stm32f1xx_hal_tim.c中4298行已经被预先定义了:__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)是一个weak类型,所以我们在main文件中直接重新定义一个HAL_TIM_IC_CaptureCallback函数即可。其他部分编写就和stc单片机没啥区别了,大家如果想搞的话可以参考我的代码。代码不够完善,希望多提意见和建议~! 以上就是我的一些心得感受,大家参考一下。代码在此:链接:
密码: 9j7t
[ 此帖被楚门在 15:46重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
本帖提到的人:
学stm也要按照基本法
谢谢分享,最近也在学HAL
最近安装了stm32cube还没琢磨咋用呢楼主就及时出现了,谢谢楼主详细的分享。
UID:832715
在线时间3010小时
M币2152专家2
发表主题贴只给奖励1M……还不如那些天天水论坛优惠购的……
UID:1078085
在线时间651小时
M币4097专家7
3元的GPS???有没有链接
UID:832715
在线时间3010小时
M币2152专家2
回 江小g 的帖子
:3元的GPS???有没有链接 ( 15:21) 淘宝搜剪线gps 选二手 应该就有了,不过刚看了一下没有三块的了,五块六块的还是有的
UID:1621476
在线时间4094小时
M币599专家1
回 江小g 的帖子
:3元的GPS???有没有链接 ( 15:21) 我来给你一个,
UID:1505079
在线时间265小时
M币5769专家10
最近安装了stm32cube还没琢磨咋用呢楼主就及时出现了,谢谢楼主详细的分享。
UID:806097
在线时间268小时
M币840专家3
HAL库函数没有WriteByte函数了,所以需要操作寄存器了。是的,这个的确不方便
UID:1795013
在线时间4033小时
M币32483专家171
回 慕名而来 的帖子
:最近安装了stm32cube还没琢磨咋用呢楼主就及时出现了,谢谢楼主详细的分享。 ( 20:24) 没有下载器?不会编程?人人都可以玩——一根数据线吊打pos内stm32f4单片机(教程)|
UID:1795013
在线时间4033小时
M币32483专家171
不过用多了感觉我还是习惯用标准库
俺用stm32标准库函数没有模板的话初始化起来总是容易丢东西……
UID:832715
在线时间3010小时
M币2152专家2
俺用stm32标准库函数没有模板的话初始化起来总是容易丢东西……
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:10-13 10:46, Total 0.133028(s) query 7,
Gzip enabled&藤本植物导航
&>&&>&&>&正文
一、Adc特性 1.1 Adc概述 Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道。不同通道的 A/D 转换可以在单一、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗和DMA。 1.2 Adc初始化 和大多数外设一样,Adc在使用前必...
如何通过HAL库函数使用ADC
、Adc特性1,常规组才开始继续采集。如果只想采集一个通道的数值,只将一个通道写入组里,可以将通道分成两种类型的组。1,以减少准确性错误。1.3 通道的选择对于16个可复用的通道, adc对组中的每一个通道根据寄存器里的序列进行一次转换。1.4 触发方式要触发一次ad转换,可以由内部软件触发,或者外部触发,常规组的采集会被中断。直到注入组采集完之后。常规组和注入组。不同通道的 A&#47。当一个组包含多个通道时.2 Adc初始化和大多数外设一样,Adc在使用前必须初始化时钟源,并从掉电模式唤醒该设备。建议在初始化Adc后立即运行一次校准,要开启扫描模式,当注入组的采集被触发时、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗和DMA;D 转换可以在单一。想采集多个通道的数值,就将多个通道写入组里,组序列保存在寄存器ADC_SQRx和ADC_JSQR中。常规组可以包含最多16个通道,注入组最多包含4个通道。注入组可以理解为常规组的一种中断。要不要使用外部触发由控制寄存器里的EXTTRIG位来指定。内部触发自然是通过写控制寄存器里的相应位来触发。而外部触发则可以有八种触发源可供选择.1 Adc概述Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道如何通过HAL库函数使用ADC一、Adc特性1.1 Adc概述Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道。不同通道的 A/D 转换可以在单一、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗
一、Adc特性 1.1 Adc概述 Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道。不同通道的 A/D 转换可以在单一、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗和DMA。 1.2 Adc初始化 和大多数外设一样,Adc在使用前必...一、Adc特性 1.1 Adc概述 Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道。不同通道的 A/D 转换可以在单一、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗和DMA。 1.2 Adc初始化 和大多数外设一样,Adc在使用前必
种植经验最新
种植经验推荐
& 6种植网 版权所有
渝ICP备号-23}

我要回帖

更多关于 数据库事务的隔离级别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信