打印
[匠人手记]

STM32匠人学习笔记(连载)

[复制链接]
3289|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序匠人|  楼主 | 2009-1-20 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

STM32匠人学习笔记

一、关于万利板的程序下载问题

1、问题


打着雨伞请教,关于万利板的程序下载问题
先说一下匠人的经历。
第一次,下载LCDDemo.eww到板上,在线运行正常,脱离ST-link后单独用USB供电,也正常。这应该视为程序被正常下载到芯片了吧。这没问题,从略。
第二次,换了一个ADC 的演示程序,编译、debug,照样出现下载对话框,完成后点击go,运行,也正常,LCD 屏幕上现实ADC结果。到这为止都还算正常。接着,匠人点击Stop Debugging按钮,停止调试。并退出IAR,并切换到USB(CN5接口)供电,同时也把CN2短路帽切换到USB。这时,发现LCD显示的居然不是ADC结果,而是第一次灌入的那个程序的内容“stm32 lcd demo”。
反复进行第二次的动作,结果都是如此,即不管仿真时选择了哪个演示程序,调试时运行正确,一旦脱离仿真状态,改用USB供电,运行的就是“stm32 lcd demo”。
why?

2、原因


       两个DEMO程序的区别在于,第一个DEMO设置为在FLASH_ROM中运行,而第二个DEMO设置为在RAM里运行,因此,重新上电后就丢失了。

3、解决


必须把设置更改为在FLASH_ROM中运行,步骤如下:
1、 workspace窗口下面,选择BOOT_FLASH,如下图:


图 1.1:设置BOOT_FLASH
2、 鼠标右击项目,打开Options窗口,选择LinkerConfig标签,把原来设置的“lnkarm_ram.scl”文件修改为“ linkarm_flash.xcl”。如下图:


图 1.2:设置lnkarm_RAM.xcl文件
备注:
如果在Flash中调试程序,设置lnkarm_flash.xcl;
如果在RAM中调试程序,设置lnkarm_RAM.xcl;
在进行设置时,要确认电路板上的Boot0 和Boot1引脚的跳线连接是否正确。
STM32固件库中有“lnkarm_ram.scl”和 “ linkarm_flash.xcl”的工程模板。
3、 重新下载程序,并改用USB口供电后验证,问题解决。

4、启发


对于用过RAM的人来说,这可能不是问题。但是对于象匠人这种从单片机转学RAM的人来说,应该建立这个概念,就是,程序不仅仅可以在FALSH中运行,而且可以在RAM中运行。所以,如果仅仅把程序下载到RAM中,那一掉电,自然就丢死了程序。
不怕做不到,就怕想不到啊!

相关帖子

来自 2楼
程序匠人|  楼主 | 2009-2-1 22:24 | 只看该作者

改进后的鼠标程序

匠人的寒假作业——改进后的鼠标程序 

//--------------------------------------------------------
// 项目:鼠标程序
// 模块:主程序
// 说明:
// 设计:程序匠人(版权所有,引用者请保留原作者姓名)
//--------------------------------------------------------
/*
版本说明:

V01        2009-2-1 22:11:47    
    在原DEMO程序上改进如下:
    1.4个方向键,原来是单击有效,每次击键,鼠标移动一次.现在改为连击有效,当方向键连续按下时,鼠标持续移动
    2.鼠标每次移动的步长,原来固定30点.现在改为由电位器调节,步长范围=ADC采样结果的高4位+1(1~16)
    3.原来只支持"上下左右"4个方向,现在支持"正上正下正左正右左上右上左下右下"8个方向
    4.KEY2改为鼠标左键
    5.KEY3改为鼠标右键
    6.KEY4(方向键中间键)改为鼠标中键
    7.LCD显示内容改为:"CXJR"
    8.按键原来是用中断检测,改为在主程序中查询.
*/
//--------------------------------------------------------

//略。。。。。


//--------------------------------------------------------
//主函数
//--------------------------------------------------------
int main(void)
{

//略。。。。。

  while(1)
  {
    write_string("CXJR");  
      Mouse_Send();
}
}

//--------------------------------------------------------
//鼠标报告描述符发送
//--------------------------------------------------------
void Mouse_Send(void)
{
  u8 Mouse_Buffer[4] = {0, 0, 0, 0};
  s8 X = 0, Y = 0;

  
  //========方向键处理(步长=ADC采样结果的高4位+1(1~16))
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_RIGHT))
  {
      X += (ADC_ConvertedValue/256+1);        
  }
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_LEFT))
  {
      X -= (ADC_ConvertedValue/256+1);        
  }
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_UP))
  {
      Y -= (ADC_ConvertedValue/256+1);        
    }
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_DOWN))
    {
      Y += (ADC_ConvertedValue/256+1);        
    }
  Mouse_Buffer[1] = X;                                                                                  // prepare buffer to send 
  Mouse_Buffer[2] = Y;

    //========按键处理
  if (!GPIO_ReadInputDataBit(GPIOD, MOUSE_LEFT))
     {
          Mouse_Buffer[0] = 0X01;
     }
  if (!GPIO_ReadInputDataBit(GPIOD, MOUSE_RIGHT))
     {
           Mouse_Buffer[0] = 0X02;
     }
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_SEL))
     {
           Mouse_Buffer[0] = 0X04;
     }

    //========
  UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4);          //copy mouse position info in ENDP1 Tx Packet Memory Area
  SetEPTxValid(ENDP1);                                                                                     // enable endpoint for transmission 
}
//略。。。。。
 
 

使用特权

评论回复
板凳
computer00| | 2009-1-20 11:58 | 只看该作者

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

使用特权

评论回复
地板
lpf336| | 2009-1-20 13:00 | 只看该作者

地板

使用特权

评论回复
5
xwj| | 2009-1-20 13:01 | 只看该作者

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

使用特权

评论回复
6
程序匠人|  楼主 | 2009-1-20 14:24 | 只看该作者

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

人家不是说了,写程序是青春饭吗?

使用特权

评论回复
7
程序匠人|  楼主 | 2009-1-23 11:51 | 只看该作者

GPIO的模式选择

这几天被例程中的IO口控制部分绕晕了。

总算理顺了下面几个模式选择的对应关系:

GPIO的模式选择:

  GPIO_Mode_AIN = 0x0,                         模拟输入

  GPIO_Mode_IN_FLOATING = 0x04,                输入悬空

  GPIO_Mode_IPD = 0x28,                        输入下拉

  GPIO_Mode_IPU = 0x48,                        输入上拉

  GPIO_Mode_Out_OD = 0x14,                     通用输出 开漏

  GPIO_Mode_Out_PP = 0x10,                     通用输出 推挽

  GPIO_Mode_AF_OD = 0x1C,                      复用输出 开漏

  GPIO_Mode_AF_PP = 0x18                       复用输出 推挽

另外发现有些例程也是明显让人吃药。。。。。

使用特权

评论回复
8
computer00| | 2009-1-23 11:55 | 只看该作者

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

使用特权

评论回复
9
DLWLMLJ| | 2009-2-1 15:20 | 只看该作者

过完年了

快来更新啊

使用特权

评论回复
10
竹林深处| | 2009-2-4 21:46 | 只看该作者

学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

734

主题

11156

帖子

676

粉丝