[匠人手记] STM32匠人学习笔记(连载)

[复制链接]
 楼主| 程序匠人 发表于 2009-1-20 11:47 | 显示全部楼层 |阅读模式
<H2>STM32匠人学习笔记</H2><H3>一、关于万利板的程序下载问题</H3><H4>1、问题</H4><br />打着雨伞请教,关于万利板的程序下载问题<br />先说一下匠人的经历。<br />第一次,下载LCDDemo.eww到板上,在线运行正常,脱离ST-link后单独用USB供电,也正常。这应该视为程序被正常下载到芯片了吧。这没问题,从略。<br />第二次,换了一个ADC&nbsp;的演示程序,编译、debug,照样出现下载对话框,完成后点击go,运行,也正常,LCD&nbsp;屏幕上现实ADC结果。到这为止都还算正常。接着,匠人点击Stop&nbsp;Debugging按钮,停止调试。并退出IAR,并切换到USB(CN5接口)供电,同时也把CN2短路帽切换到USB。这时,发现LCD显示的居然不是ADC结果,而是第一次灌入的那个程序的内容“stm32&nbsp;lcd&nbsp;demo”。<br />反复进行第二次的动作,结果都是如此,即不管仿真时选择了哪个演示程序,调试时运行正确,一旦脱离仿真状态,改用USB供电,运行的就是“stm32&nbsp;lcd&nbsp;demo”。<br />why?<H4>2、原因</H4><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两个DEMO程序的区别在于,第一个DEMO设置为在FLASH_ROM中运行,而第二个DEMO设置为在RAM里运行,因此,重新上电后就丢失了。<H4>3、解决</H4><br />必须把设置更改为在FLASH_ROM中运行,步骤如下:<br /><B>1、&nbsp;</B><B>在</B><B>workspace</B><B>窗口下面,选择</B><B>BOOT_FLASH,</B><B>如下图:</B><B></B><br /><br /><img src="http://blog.21ic.com/UploadFiles/2009-1/201127711935.jpg"><br />图&nbsp;1.1:设置BOOT_FLASH<br /><B>2、&nbsp;</B><B>鼠标右击项目,打开</B><B>Options</B><B>窗口,选择</B><B>Linker</B><B>的</B><B>Config</B><B>标签,把原来设置的“</B><B>lnkarm_ram.scl</B><B>”文件修改为“</B><B>&nbsp;linkarm_flash.xcl</B><B>”。如下图:</B><B></B><br /><br /><img src="http://blog.21ic.com/UploadFiles/2009-1/201128731435.jpg"><br />图&nbsp;1.2:设置lnkarm_RAM.xcl文件<br />备注:<br />如果在Flash中调试程序,设置lnkarm_flash.xcl;<br />如果在RAM中调试程序,设置lnkarm_RAM.xcl;<br />在进行设置时,要确认电路板上的Boot0&nbsp;和Boot1引脚的跳线连接是否正确。<br />STM32固件库中有“lnkarm_ram.scl”和&nbsp;“&nbsp;linkarm_flash.xcl”的工程模板。<br /><B>3、&nbsp;</B><B>重新下载程序,并改用</B><B>USB</B><B>口供电后验证,问题解决。</B><B></B><H4>4、启发</H4><br />对于用过RAM的人来说,这可能不是问题。但是对于象匠人这种从单片机转学RAM的人来说,应该建立这个概念,就是,程序不仅仅可以在FALSH中运行,而且可以在RAM中运行。所以,如果仅仅把程序下载到RAM中,那一掉电,自然就丢死了程序。<br />不怕做不到,就怕想不到啊!
 楼主| 程序匠人 发表于 2009-2-1 22:24 | 显示全部楼层

改进后的鼠标程序

匠人的寒假作业——改进后的鼠标程序&nbsp;<br /><br />//--------------------------------------------------------<br />//&nbsp;项目:鼠标程序<br />//&nbsp;模块:主程序<br />//&nbsp;说明:<br />//&nbsp;设计:程序匠人(版权所有,引用者请保留原作者姓名)<br />//--------------------------------------------------------<br />/*<br />版本说明:<br /><br />V01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2009-2-1&nbsp;22:11:47&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在原DEMO程序上改进如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;1.4个方向键,原来是单击有效,每次击键,鼠标移动一次.现在改为连击有效,当方向键连续按下时,鼠标持续移动<br />&nbsp;&nbsp;&nbsp;&nbsp;2.鼠标每次移动的步长,原来固定30点.现在改为由电位器调节,步长范围=ADC采样结果的高4位+1(1~16)<br />&nbsp;&nbsp;&nbsp;&nbsp;3.原来只支持&quot;上下左右&quot;4个方向,现在支持&quot;正上正下正左正右左上右上左下右下&quot;8个方向<br />&nbsp;&nbsp;&nbsp;&nbsp;4.KEY2改为鼠标左键<br />&nbsp;&nbsp;&nbsp;&nbsp;5.KEY3改为鼠标右键<br />&nbsp;&nbsp;&nbsp;&nbsp;6.KEY4(方向键中间键)改为鼠标中键<br />&nbsp;&nbsp;&nbsp;&nbsp;7.LCD显示内容改为:&quot;CXJR&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;8.按键原来是用中断检测,改为在主程序中查询.<br />*/<br />//--------------------------------------------------------<br /><br />//略。。。。。<br /><br /><br />//--------------------------------------------------------<br />//主函数<br />//--------------------------------------------------------<br />int&nbsp;main(void)<br />{<br /><br />//略。。。。。<br /><br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;write_string(&quot;CXJR&quot;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mouse_Send();<br />}<br />}<br /><br />//--------------------------------------------------------<br />//鼠标报告描述符发送<br />//--------------------------------------------------------<br />void&nbsp;Mouse_Send(void)<br />{<br />&nbsp;&nbsp;u8&nbsp;Mouse_Buffer[4]&nbsp;=&nbsp;{0,&nbsp;0,&nbsp;0,&nbsp;0};<br />&nbsp;&nbsp;s8&nbsp;X&nbsp;=&nbsp;0,&nbsp;Y&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//========方向键处理(步长=ADC采样结果的高4位+1(1~16))<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;JOY_RIGHT))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;+=&nbsp;(ADC_ConvertedValue/256+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;JOY_LEFT))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;-=&nbsp;(ADC_ConvertedValue/256+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;JOY_UP))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;-=&nbsp;(ADC_ConvertedValue/256+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;JOY_DOWN))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;+=&nbsp;(ADC_ConvertedValue/256+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;Mouse_Buffer[1]&nbsp;=&nbsp;X;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prepare&nbsp;buffer&nbsp;to&nbsp;send&nbsp;<br />&nbsp;&nbsp;Mouse_Buffer[2]&nbsp;=&nbsp;Y;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//========按键处理<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;MOUSE_LEFT))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mouse_Buffer[0]&nbsp;=&nbsp;0X01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;MOUSE_RIGHT))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mouse_Buffer[0]&nbsp;=&nbsp;0X02;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(!GPIO_ReadInputDataBit(GPIOD,&nbsp;JOY_SEL))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mouse_Buffer[0]&nbsp;=&nbsp;0X04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//========<br />&nbsp;&nbsp;UserToPMABufferCopy(Mouse_Buffer,&nbsp;GetEPTxAddr(ENDP1),&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//copy&nbsp;mouse&nbsp;position&nbsp;info&nbsp;in&nbsp;ENDP1&nbsp;Tx&nbsp;Packet&nbsp;Memory&nbsp;Area<br />&nbsp;&nbsp;SetEPTxValid(ENDP1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;enable&nbsp;endpoint&nbsp;for&nbsp;transmission&nbsp;<br />}<br />//略。。。。。<br />&nbsp;<br />&nbsp;<br />
computer00 发表于 2009-1-20 11:58 | 显示全部楼层

恭喜匠人,贺喜匠人~~~~终于大撤大误了,不再老年痴呆~~~

  
lpf336 发表于 2009-1-20 13:00 | 显示全部楼层

地板

  
xwj 发表于 2009-1-20 13:01 | 显示全部楼层

哈哈,这次的老年痴呆稍微轻一点点

  
 楼主| 程序匠人 发表于 2009-1-20 14:24 | 显示全部楼层

哈哈,未老先衰,技术人的通病

人家不是说了,写程序是青春饭吗?
 楼主| 程序匠人 发表于 2009-1-23 11:51 | 显示全部楼层

GPIO的模式选择

这几天被例程中的IO口控制部分绕晕了。<br /><br />总算理顺了下面几个模式选择的对应关系:<br /><br />GPIO的模式选择:<br /><br />&nbsp;&nbsp;GPIO_Mode_AIN&nbsp;=&nbsp;0x0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模拟输入<br /><br />&nbsp;&nbsp;GPIO_Mode_IN_FLOATING&nbsp;=&nbsp;0x04,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入悬空<br /><br />&nbsp;&nbsp;GPIO_Mode_IPD&nbsp;=&nbsp;0x28,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入下拉<br /><br />&nbsp;&nbsp;GPIO_Mode_IPU&nbsp;=&nbsp;0x48,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入上拉<br /><br />&nbsp;&nbsp;GPIO_Mode_Out_OD&nbsp;=&nbsp;0x14,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通用输出&nbsp;开漏<br /><br />&nbsp;&nbsp;GPIO_Mode_Out_PP&nbsp;=&nbsp;0x10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通用输出&nbsp;推挽<br /><br />&nbsp;&nbsp;GPIO_Mode_AF_OD&nbsp;=&nbsp;0x1C,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复用输出&nbsp;开漏<br /><br />&nbsp;&nbsp;GPIO_Mode_AF_PP&nbsp;=&nbsp;0x18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复用输出&nbsp;推挽<br /><br />另外发现有些例程也是明显让人吃药。。。。。
computer00 发表于 2009-1-23 11:55 | 显示全部楼层

哈哈,慢慢来...用结构体传递很多参数就是叫人晕...

  
DLWLMLJ 发表于 2009-2-1 15:20 | 显示全部楼层

过完年了

快来更新啊
竹林深处 发表于 2009-2-4 21:46 | 显示全部楼层

学习了

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

734

主题

11156

帖子

683

粉丝
快速回复 在线客服 返回列表 返回顶部