一根数据线吊打一元pos内stm32f4stm32单片机教程(

【图片】人人都可以玩—一根数据线吊打一元pos内stm32f4单片机(教程)【技术宅吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,079,107贴子:
人人都可以玩—一根数据线吊打一元pos内stm32f4单片机(教程)收藏
之前大家都疯狂撸了pos机,但是大部分人都是拆了电池然后吃灰,但是也有部分人利用起了单片机。现在玩的比较多的是stm/gd32f103系列的,而也有另外几款单片机,用的是stm32f401ccu6,主要是一些音频机(如飞钱)和帐帐通之类的,这种单片机其实性能更好,但是因为封装比较蛋疼,没风枪玩不不了,而且这款单片机因为比较小众,玩的人不多,所以网上资料也不多,更是增加了他被堆灰的可能性。但是,今天我给大家带来两种思路,不用怕没有各种link下载器,不用怕没有usb转串口模块,不用怕不会编程,焊工不好不要紧,嫌飞线麻烦,引脚复杂的的这次不用飞,只有你买了这款pos机,有一台电脑,其他的通通可以不用。首先准备:1、pos机一台,核心是stm32f401ccu62、usb数据线一根,ps:这款pos机配的usb线是带数据的,可以用,不用另准备3、选配,非必需:烙铁一把软件方面:1、keil-uVision5-mdk(下载安装和谐注册问题自行解决,百度一搜教程一大把)2、STM32CubeMX软件,可以去官网下载也可以百度一大把3、STSW-STM32080软件(stdfuse),下载:htt我p://你mcu.org/docu和ment/detail/ind看ex/id-215大480行,准备好了,我们正式开始。先分析硬件,我们需要把芯片的boot0拉高,其他接口均不用管,以飞钱pos机为例演示boot0接口在晶振旁边,如图所示红圈的地方那有两个焊盘,都是设置boot用的,原始的状态是下面的焊盘接了10k的电阻到地但在下载的时候我们需要把他上拉到vcc,就可以想这样,吧电阻移到上面但是这样移动来移动去的是不是太麻烦,每次下载都要先移到vcc,下载完又移动回来,烙铁一直开着太麻烦所以我搞了根线在另外一头焊了个排针,排针一边接vcc,一边接刚才的焊盘,要用的时候接上短路帽就好热熔胶增加强度没有烙铁的同学,或者不会用的同学,可以在下载前用金属物,比如镊子,鳄鱼夹吧刚才提到的焊盘短接也就是图中红圈里没有焊电阻的焊盘,靠晶振的那个焊盘,插上usb线到电脑就可以取下金属物好的硬件改造已完成,其他地方,包括串口,sw口均不用管然后打开我们之前安装好的软件依次点击左上角菜单,help-install new libraries,进入一下界面寻找并选中图中选项(stm32f4最新版),单击右下角install now开始下载附件包,如果你对自己网速自信的话,可以这样下载并安装。如果网速不行的,自行百度,有不少上传到网盘的,下载好后选择左下角 from local安装下载完成后,回到刚才的界面点new project选项弹出选项,找到如图的芯片,就是pos机上的单片机型号点ok后,加入主界面左侧点击rcc选项栏,设置如图,意思是选用外部高速晶振然后在图片上点击引脚pb7和pb4,选择gpio_output选项这两个io就是pos机上的led灯控制引脚,选完后引脚变绿点击左上选项卡进入第二选项,时钟树设置调整参数如下,最好不要差太多然后选择第三个选项其他选项不用管,软件左侧的黄色警告无视之选gpio选项,双击进入双击后这样点击每个引脚,下面的配置都设置成这样,ok软件左上方,点红圈圈住的齿轮状图标 生成工程,名字自己写,保存路径什么的不用说吧,下面的ide根据自己的选,我让你们下载的的是keil-mdk v5版本,其他的也行,选对就好点ok后,完工,关闭软件这款软件还不会玩的,这里有更详细的教程:htt我p://度/thread-46和381-1-1.html打开刚才的文件保存路径,在mdk-arm文件夹下,用keil打开工程不用看代码是啥,不用管,第一步选魔术棒按钮选项卡调到output,勾选红圈内选项,输出hex第二步,点全部编译按钮,编译完成关闭keil,代码看都不用看一眼,更不用写这时打开第三个软件的安装目录,在bin文件夹下,我们用到红圈的两个软件先开第一个,选项默认,点确定点击按钮,选择刚才keil中生成的hex文件,hex在
工程文件夹/mdk-aarm/工程名
文件夹下面点击generate按钮,保存dfu文件后关闭软件打开第二个软件这时回到pos机,吧boot0短接到vcc,也就是我们刚才改造好的方法,然后通过usb接口用数据线吧pos机接入到电脑软件检测到了pos芯片的接入,选择红圈按钮,打开刚才保存的dfu文件在打开文件瞬间,已经被下载到pos机了,时间是00;00;00,闪电般,比串口下载或者stlink下载都快 拔下pos机,取下短接帽,让boot0恢复到低电平,再次上电灯亮了,因为两个灯是连体的,其实都亮了,只是不明显 看吧,整个过程没有任何技术难度,教程自认为很详细,只是操作有点繁琐,我认为只有有心,都能吊打这款pos机单片机 说几点额外的话1、如果显示下载失败什么的,可以尝试先解锁单片机就是点右边的按钮,upgrade,会提示单片机已经被锁住,一路确定下去,单片机就被解锁2、原理是usb的dfu升级功能,不是原来pos机固件里面的,是单片机的官方bootloader内置的高级玩意,也就是说在boot0拉高后,可以通过除了串口,usb等等有用的方法下载,具体可以看数据手册。不过这个玩法只支持stm32f4系列,心里想着stm32f103系列的也这样的,两个选择:自己移植,官方提供了例程,改改可用;另外一种方法比较推荐,洗洗睡吧,该用串口下载还是用串口吧,有stlink的老老实实的用吧。原来pos机的固件可以dfu更新但是不是通过这种方法,因为不用拉boot0就能下,是开发者自己写的。3、好久不来宅吧,这贴是我首发在隔壁论坛的,自己转过来,没什么侵权问题 4、希望宅吧有更多高质量的贴
深夜顶--------双十一过去了,听说你还单身
拆了一堆都在吃灰。。
不过结果是啥样?
顶贴,我看到了新天地,这东西好像配置时钟不用写代码,直接点时钟路径?
没有电路图玩什么
能下载就能实现一切
如果真心要学,不如直接买开发板
最后一句才是重点
不知道我这几个行不行
没人看,自己顶
真正的技术贴顶
楼主 蓝牙版的怎么破
楼主,这东西的电池容量是多大的
买的蓝牙版,要怎么玩,
登录百度帐号推荐应用还没有帐号? 赶紧
用户版块帖子
再拆个很火的一元POS,奇葩的是居然有俩STM32
UID:828328
在线时间653小时
M币3583专家6
跟风撸了十多个POS,全拆了,都是STM32,GD32,EFT32,头一个俩单片机的,有个32在蓝牙模块上=740) window.open('/mobcent/app/data/smilies/15.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="再拆个很火的一元POS,奇葩的是居然有俩STM32" alt="再拆个很火的一元POS,奇葩的是居然有俩STM32">=740) window.open('/mobcent/app/data/smilies/15.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="再拆个很火的一元POS,奇葩的是居然有俩STM32" alt="再拆个很火的一元POS,奇葩的是居然有俩STM32">=740) window.open('/mobcent/app/data/smilies/15.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="再拆个很火的一元POS,奇葩的是居然有俩STM32" alt="再拆个很火的一元POS,奇葩的是居然有俩STM32">=740) window.open('/mobcent/app/data/smilies/15.png');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="再拆个很火的一元POS,奇葩的是居然有俩STM32" alt="再拆个很火的一元POS,奇葩的是居然有俩STM32">
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
好像也有一个这样的
这个能用来做啥嘞??
看你们撸呀橹,拆呀拆,玩呀玩,咋我的就没见发货呢?欺我是民工?
優秀文章,我也有这个
UID:1109751
在线时间938小时
M币3222专家1
優秀文章,我也有这个
UID:1677795
在线时间1673小时
M币1086专家2
STM32F07 我下午刚收到一个。 还有一个STM32F103 加一个STM8F103的。
UID:1795013
在线时间4075小时
M币46459专家225
还有吗?有的话麻烦pm连接
UID:1377562
在线时间3989小时
M币13602专家9
看你们撸呀橹,拆呀拆,玩呀玩,咋我的就没见发货呢?欺我是民工?
要广撒网,广撒网懂不,72小时不发货的未按约定时间发货关掉,心情不好就投诉,哈。
UID:775066
在线时间132小时
M币12专家0
回 firstbird 的帖子
:STM32F07 我下午刚收到一个。[表情] 还有一个STM32F103 加一个STM8F103的。 ( 20:08) 是stm8003f3 音频版的吧
UID:828328
在线时间653小时
M币3583专家6
这个是音频版?就是说可以做蓝牙音响了?
UID:821946
在线时间554小时
M币513专家1
这东西拆一个就够了,拆那么多,拿那些电池来干什么
UID:795814
在线时间398小时
M币15574专家1
这个能用来做啥嘞??
UID:1947575
在线时间583小时
M币5754专家2
前几天把个帐帐通的研究坏了,今天早晨在另一下了一单,到现在还没有发货,会不会不发货了呀
访问内容超出本站范围,不能确定是否安全
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-13 04:16, Total 0.110430(s) query 11,
Gzip enabled&还没有帐号? 赶紧
用户版块帖子
【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动下载)
UID:1016785
在线时间795小时
M币259专家10
下贴预告,敬请期待:【POS机 实验2】从今天开始,像使用U盘一样,1根USB数据线升级STM32、GD32(模拟U盘在线升级固件) 好了,转回今天的主题 —— 一键串口自动下载电路 + 支持嵌入MDK的uISP,最终效果如下图所示:
【硬件方面】看到一些没有JLINK、ST-LINK工具的坛友,在用串口下载STM32、GD32时还是手动跳线BOOT0和复位,很麻烦!现在,我给大家介绍一个 超简单的 STM32、GD32一键串口自动下载电路,只需在原来的 USB-TTL下载小板 上加几个元件(下图蓝色圈圈):1个开关二极管1N4148 和 1个1K的电阻、排针等 USB-TTL下载板(比如PL2303HX)
PL2303HX管脚图
【软件方面】STM32、GD32 目前最好用的ISP下载软件:uISP V1.32 和 FlyMcu V0.168,尤其是uISP,更方便,更加人性化。 两者共同点:1、都支持STM32、GD322、都支持一键自动下载电路3、绿色免安装 uISP 比 FlyMcu 优越的地方:1、支持命令下载,可以嵌入MDK中,做到真正的一键自动串口下载程序2、可以自动识别一键下载电路3、最高支持1843200bps波特率4、自带串口助手
uISP作者原贴: uISP下载:
作者的uISP说明: 1. BOOT0和BOOT1引脚分别接10K下拉电阻到地; 2. PC的串口信号经电平转换后, && PC机TXD接STM32的USART1_RX, && PC机RXD接STM32的USART1_TX, && PC串口DTR和RTS用于控制STM32进入Bootloader, && 根据uISP上的设置对应不同的接线。 例如:&& 当在uISP上选择“DTR高电平复位,RTS低电平进入Bootloader”时,&&&&则DTR接STM32的nRST, RTS接STM32的BOOT0, 另外,这里的DTR高电平和RTS低电平指的是RS232电平,分别对应TTL的低电平和高电平,这点容易混淆,导致下载失败。 3. 嵌入MDK中直接下载的方法: 打开MDK, 进入Option for Target 'XXXXX'设置,切换到Utilities选项卡,选择Use External Tool for Flash Programming, 在Command里选择uISP的安装位置,例如C:\Program Files\uISP for STM32\uISP.exe,在Arguments里输入#H点击OK, 设置完毕。然后直接点击工具栏的“LOAD”即可下载。
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
M太贵了,给个网盘,送你 MM可以吗!
JLINK的片内内存调试功能你可以试下,调试程序在内存中运行,不会改写片内原先的程序。
原創內容&& 感谢楼主分享自己的经验。
UID:1978516
在线时间2771小时
M币24741专家3
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
可惜了,我的HL340 ttl下载线,貌似没有 dtr,rts 信号pin,无法使用楼主留言:HL340 ttl下载线&&里面的芯片应该是CH340(有dtr,rts 信号引脚),但如果封装成线不引出无解了
UID:1947575
在线时间583小时
M币5754专家2
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
可惜了,我的分离元件自制串口小板貌似也没有dtr,rts 信号pin无法使用
UID:1016785
在线时间795小时
M币259专家10
回 快速回复 的帖子
:可惜了,我的分离元件自制串口小板貌似也没有dtr,rts 信号pin无法使用 ( 11:05) 原生串口有的啊
UID:1795013
在线时间4075小时
M币46459专家225
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
我自己做的开发板上面有正点原子的那套电路,用起来赶脚稳定性有点差,容易复位不了。然后stm32f401系列是支持直接usb下载的,已经发教程,看我帖子,103系列倒是的自己写升级固件楼主留言:看过那贴,太复杂了,我准备发的是:STM32、GD32 只需要下载1次USB MSD Bootloader,以后STM32、GD32 接USB数据线,在电脑上就会模拟成1个U盘,只要把固件拖进U盘就可以升级程序了
UID:1795013
在线时间4075小时
M币46459专家225
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
不过说实话还是stlink或者jlink最方便楼主留言:是方便,而且stlink V2便宜
UID:1795013
在线时间4075小时
M币46459专家225
:我自己做的开发板上面有正点原子的那套电路,用起来赶脚稳定性有点差,容易复位不了。然后stm32f401系列是支持直接usb下载的,已经发教程,看我帖子,103系列倒是的自己写升级固件 ( 11:21) 感谢分享,我也去看看,谢了
UID:1477033
在线时间679小时
M币27专家0
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
看了楼主的帖子,发现还是需要其他模块,对我无望了。说说我的辛酸史,学习了一段时间的STM32,准备上手改造POS机做个最小板,结果发现任何数据线都没有,没法把程序下载到芯片中。求教坛友之后说是可以用串口代替,然后有说CH340的TTL,刚好手中有一块玩路由器时买的XTW100PRO的烧芯片工具,板上只有N、E、T、R、G五个孔,旁边标识为ISP1,也不知道是不是TTL,连排针都没有,于是自己焊上,然后连接电脑发现商家提供的驱动中没有对应的ISP1功能,嚓 白忙一趟。不死心,过了几天后想起电脑主板上有串口RS232,于是准备用串口连接POS机芯片,查了一下资料,发现RS232串口是±15v电平,SUART是TTL电平只有±5v,这中间需要一块RS232转TTL的模块连接,转换模块是用MAX232E做的,嚓~~~又没希望了。然后在网上发现可以用三极管模拟电路代替转换模块,于是心中一阵激动,想自己DIY一个模块不就可以了么,看了三极管模拟的电路图,发现其他零件都有,唯独缺1N4148二极管,手中有的全是整流二极管,我嚓,没办法了,目前暂时搁置了。这次我要忍住不买任何工具,之前玩路由器已经花了近两千元,买了之后没玩几下全部闲置,实在是浪费。
UID:1562418
在线时间400小时
M币1000专家1
Re:【POS机 外篇】原来串口下载STM32、GD32程序也可以如此简单(MDK里一键串口自动 ..
楼主留言:看过那贴,太复杂了,我准备发的是:STM32、GD32 只需要下载1次USB MSD Bootloader,以后STM32、GD32 接USB数据线,在电脑上就会模拟成1个U盘,只要把固件拖进U盘就可以升级程序了.这个功能太期待了!是否用usb升级时只需要usb的4根线啊?楼主留言:是的
UID:1016785
在线时间795小时
M币259专家10
回 zylmp 的帖子
:看了楼主的帖子,发现还是需要其他模块,对我无望了。说说我的辛酸史,学习了一段时间的STM32,准备上手改造POS机做个最小板,结果发现任何数据线都没有,没法把程序下载到芯片中。求教坛友之后说是可以用串口代替,然后有说CH340的TTL,刚好手中有一块玩路由器时买的XTW100PRO的烧芯片工具,板上只有N、E、T、R、G五个孔,旁边标识为ISP1,也不知道是不是TTL,连排针都没有,于是自己焊上,然后连接电脑发现商家提供的驱动中没有对应的ISP1功能,嚓[表情] 白忙一趟。不死心,过了几天后想起电脑主板上有串口RS232,于是准备用串口连接POS机芯片,查了一下资料,发现RS232串口是±15v电平,SUART是TTL电平只有±5v,这中间需要一块RS232转TTL的模块连接,转换模块是用MAX232E做的,[表情]嚓~~~又没希望了。然后在网上发现可以用三极管模拟电路代替转换模块,于是心中一阵激动,想自己DIY一个模块不就可以了么,看了三极管模拟的电路图,发现其他零件都有,唯独缺1N4148二极管,手中有的全是整流二极管,我嚓,没办法了,目前暂时搁置了。这次我要忍住不买任何工具,之前玩路由器已经花了近两千元,买了之后没玩几下全部闲置,实在是浪费。
这电路没那么严格,用整流管代替也可以,前一个二极管是整流提供负压,后一个二极管是保护三极管(防止反向电压击穿)
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-13 04:16, Total 0.113586(s) query 11,
Gzip enabled&还没有帐号? 赶紧
用户版块帖子
用STM32CubeMX和HAL库函数做的GPS+24L01授时时钟加调光台灯
UID:832715
在线时间3031小时
M币2320专家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
在线时间3031小时
M币2320专家2
发表主题贴只给奖励1M……还不如那些天天水论坛优惠购的……
UID:1078085
在线时间664小时
M币7459专家15
3元的GPS???有没有链接
UID:832715
在线时间3031小时
M币2320专家2
回 江小g 的帖子
:3元的GPS???有没有链接 ( 15:21) 淘宝搜剪线gps 选二手 应该就有了,不过刚看了一下没有三块的了,五块六块的还是有的
UID:1621476
在线时间4129小时
M币775专家2
回 江小g 的帖子
:3元的GPS???有没有链接 ( 15:21) 我来给你一个,
UID:1505079
在线时间281小时
M币5914专家11
最近安装了stm32cube还没琢磨咋用呢楼主就及时出现了,谢谢楼主详细的分享。
UID:806097
在线时间270小时
M币862专家3
HAL库函数没有WriteByte函数了,所以需要操作寄存器了。是的,这个的确不方便
UID:1795013
在线时间4075小时
M币46459专家225
回 慕名而来 的帖子
:最近安装了stm32cube还没琢磨咋用呢楼主就及时出现了,谢谢楼主详细的分享。 ( 20:24) 没有下载器?不会编程?人人都可以玩——一根数据线吊打pos内stm32f4单片机(教程)|
UID:1795013
在线时间4075小时
M币46459专家225
不过用多了感觉我还是习惯用标准库
俺用stm32标准库函数没有模板的话初始化起来总是容易丢东西……
UID:832715
在线时间3031小时
M币2320专家2
俺用stm32标准库函数没有模板的话初始化起来总是容易丢东西……
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-13 04:16, Total 0.139426(s) query 12,
Gzip enabled&}

我要回帖

更多关于 stm32单片机 的文章

更多推荐

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

点击添加站长微信