打印
[应用相关]

STM32外设使用要点汇总

[复制链接]
2407|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerful1|  楼主 | 2015-2-27 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
================================== MDK ===============================
1、在MDK代码编辑环境下不能使用Goto Definition(用于查找某个变量的类型及定义)、Goto Reference(用于查找某个函数申明的原型)功能?

解决:打开Project->Target-Options->Output,将Browse Information复选框勾上。


2、当使用STM32固件库与RTX Kernel时,使用isr_evt_set(),事件无响应?

解决:编辑STM32固件库的“stm32f10x_vector.s”文件:
...
    IMPORT  SVC_Handler     ;name changed according to RTX usage
    IMPORT  DebugMonitor
    IMPORT  PendSV_Handler  ;修改加入
    IMPORT  SysTick_Handler ;name changed according to RTX usage
...
    DCD  SVC_Handler
    DCD  DebugMonitor
    DCD  0                   ; Reserved
    DCD  PendSV_Handler      ;修改加入
    DCD  SysTick_Handler
沙发
powerful1|  楼主 | 2015-2-27 14:51 | 只看该作者
================================== IAR ===============================
1、IAR环境下如果链接工程文件,出现堆栈溢出错误,该如何处理?

   打开链接文件lnkarm_flash.xcl或者是lnkarm_ram.xcl  
//*************************************************************************  
// Stack and heap segments.  
//*************************************************************************  

-D_CSTACK_SIZE=400 <----------------------------------------修改这里  

注:该修改方式仅适合IAR for ARM 4.xx版本。

2、IAR编译输出HEX格式的目标文件
   1)、Options->C/C++ Compiler->Output->Generate debug information        选项前的钩去掉
   2)、Options->Assembler->Output->Generate debug information             选项前的钩去掉
   3)、Options->Linker->Output->Output File->Override default             选项前的钩选上并把文件名的后缀改成.hex
   4)、Options->Linker->Output->Output File->Format->Other                选项前的钩选上并把Output格式改为intel-extended
   经过以上设置,在Rebuld All之后会在/Debug/Exe下生成.hex格式目标文件  

3、IAR编译输出BIN格式的目标文件
   1)、Options->C/C++ Compiler->Output->Generate debug information        选项前的钩去掉
   2)、Options->Assembler->Output->Generate debug information             选项前的钩去掉
   3)、Options->Linker->Output->Output File->Override default             选项前的钩选上并把文件名的后缀改成.bin
   4)、Options->Linker->Output->Output File->Format->Other                选项前的钩选上并把Output格式改为row-binary
   经过以上设置,在Rebuld All之后会在/Debug/Exe下生成.bin格式目标文件  

使用特权

评论回复
板凳
powerful1|  楼主 | 2015-2-27 14:56 | 只看该作者
================================== CRC ===============================
1、CRC计算公式
   所有的STM32芯片都内置了一个硬件的CRC计算模块,可应用到通信程序中,这个CRC计算模块使用常见的、在以太网中使用的计算多项式:
    X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1
   写成16进制就是:0x04C11DB7

2、使用这个内置CRC模块操作步骤:
   复位CRC模块(设置CRC_CR=0x01),这个操作把CRC计算的余数初始化为0xFFFFFFFF
   把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入CRC_DR寄存器(既下图中的绿色框)
   写完所有的数据字后,就可以从CRC_DR寄存器(既下图中的兰色框)读出计算的结果。

注意:虽然读写操作都是针对CRC_DR寄存器,但实际上是访问的不同物理寄存器。

3、C语言描述的这个计算模块算法。可放在通信的另一端,对通信的正确性进行验证:

   DWORD dwPolynomial = 0x04c11db7;
   DWORD cal_crc(DWORD *ptr, int len)
   {
    DWORD xbit;
    DWORD data;
    DWORD CRC = 0xFFFFFFFF; // init
    while (len--)  
    {   
      xbit = 1 << 31;

      data = *ptr++;
      for (int bits = 0; bits < 32; bits++)  
      {
        if (CRC & 0x80000000)  
        {
          CRC <<= 1;
          CRC ^= dwPolynomial;
        }else
        CRC <<= 1;
       if (data & xbit)
       CRC ^= dwPolynomial;

       xbit >>= 1;
      }
     }
     return CRC;
    }

注意
1)、上述算法中变量CRC,在每次循环结束包含了计算的余数,它始终是向左移位(既从最低位向最高位移动),溢出的数据位被丢弃。
2)、输入的数据始终是以32位为单位,如果原始数据少于32位,需要在低位补0,当然也可以高位补0。
3)、假定输入的DWORD数组中每个分量是按小端存储。
4)、输入数据是按照最高位最先计算,最低位最后计算的顺序进行。
例如:
如果输入0x44434241,内存中按字节存放的顺序是:0x41, 0x42, 0x43, 0x44。计算的结果是:0xCF534AE1
如果输入0x41424344,内存中按字节存放的顺序是:0x44, 0x43, 0x42, 0x41。计算的结果是:0xABCF9A63

使用特权

评论回复
地板
powerful1|  楼主 | 2015-2-27 14:59 | 只看该作者
================================= Flash ==============================
1、STM32对内部Flash的保护措施  
   所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。
   1)、读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:
  通过调试器(JTAG或SWD);
  从RAM中启动并执行的程序;
   2)、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。   
   读与写设置的效果见下表:
   读保护  写保护       对Flash的操作功能
    有效   有效   CPU只能读,禁止调试和非法访问。
    有效   无效   CPU可以读写,禁止调试和非法访问,页0~3为写保护。
    无效   有效   CPU可读,允许调试和非法访问。
    无效   无效   CPU可以读写,允许调试和非法访问。

2、当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:
   1)、调试执行程序时;
   2)、从RAM启动并执行程序时

   STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。

3、Flash保护相关函数
   FLASH_Unlock();   //Flash解锁
   FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止   
   FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许

使用特权

评论回复
5
powerful1|  楼主 | 2015-2-27 15:00 | 只看该作者
============================ Device Signature ========================
1、    STM32F10xxx系列MCU内部含有一个出厂被固化的96bit唯一识别ID,该ID可以用于芯片加密、设备识别等一类特殊应用。
读取该ID的方法:
    u32 DevID[3];
    DevID[0] = *(vu32*)(0x1ffff7e8);
    DevID[1] = *(vu32*)(0x1ffff7ec);
    DevID[2] = *(vu32*)(0x1ffff7f0);

    数组DevID[3]中即保存了MCU的ID。

注:256K Flash或以上容量的STM32,仅“Z”版本才有,之前的“A”版本没有。

使用特权

评论回复
6
powerful1|  楼主 | 2015-2-27 15:01 | 只看该作者
================================== SPI ===============================
1、SPI外设的NSS引脚设置为通用IO口
   由于SPI外设的SPI_CR1寄存器中SSM置1时,NSS引脚可被被释放用于GPIO使用,因此无论是在SPI的主模式或是从模式下均可以将NSS引脚释放,由软件或硬件进行NSS管理;
   操作流程:
   1)、初始化SPI外设,设置NSS由软件管理:
   SPI_InitStructure.SPI_NSS= SPI_NSS_Soft;
   2)、如果NSS引脚用于其他外设时,需要使能NSS输出:
   SPI_SSOutputCmd(SPIx, ENABLE);

2、SPI 单线传输
   此模式下限制:只能用作输入或者输出,或者工作在半双工模式下。

使用特权

评论回复
7
powerful1|  楼主 | 2015-2-27 15:01 | 只看该作者
================================== USB ===============================
1、STM32的USB中断说明
   STM32的USB模块可产生三种中断:USB唤醒中断、USB高优先级中断和USB低优先级中断,这三种中断对应事件如下:
   1)、USB唤醒中断 - 在中断向量表中的位置是42
   这个中断在USB设备从暂停模式唤醒时产生,唤醒事件由USB_ISTR寄存器的WKUP位标识。

   2)、USB高优先级中断 - 在中断向量表中的位置是19
   这个中断仅由USB同步(Isochronous)模式传输或双缓冲块(Bulk)传输模式下的正确传输事件产生,正确传输事件由USB_ISTR寄存器的CTR位标识。

   3)、USB低优先级中断 - 在中断向量表中的位置是20
   这个中断由所有其它的USB事件产生,例如正确传输(不包括同步模式和双缓冲块模式)、USB复位等,事件标志位在USB_ISTR寄存器中。

   在STM提供的STM32 USB 开发包中的例程包含了上述三种中断的处理方法。例如在USB Speaker例程中,CTR_HP函数处理USB高优先级中断;在所有例子中都有USB_Istr()函数处理USB低优先级中断。

使用特权

评论回复
8
powerful1|  楼主 | 2015-2-27 15:01 | 只看该作者
================================= ADC ================================
1、STM32的内部温度传感器
   STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量。测量范围–40~125℃,精度 ± 1.5℃
   操作流程:
   1)、设置ADC相关参数
   // ADC1 configuration -----------------------------
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel = 1;
   ADC_Init(ADC1, &ADC_InitStructure);

   2)、选中ADC1的通道16作为输入,设置采样时间17.1us ( Ncycle × tADC = 17.1靤 )。
   // ADC1 regular channel16 Temp Sensor configuration
   ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);

   3)、设置寄存器ADC_CR2中的TSVREFE位激活温度传感器
   // Enable the temperature sensor and vref internal channel
   ADC_TempSensorVrefintCmd(ENABLE);
   
   4)、转换采样值为温度
   ADC转换结束以后,读取ADC_DR寄存器中的结果,转换温度值计算公式如下:
           V25 - VSENSE
   T(℃) = ------------  + 25
            Avg_Slope
      V25:  温度传感器在25℃时 的输出电压,典型值1.43 V。
     VSENSE:温度传感器的当前输出电压,与ADC_DR 寄存器中的结果ADC_ConvertedValue之间的转换关系为:  
                       ADC_ConvertedValue * Vdd
             VSENSE = --------------------------
                       Vdd_convert_value(0xFFF)
     Avg_Slope:温度传感器输出电压和温度的关联参数,典型值4.3 mV/℃。

     //Converted Temperature
     Vtemp_sensor = ADC_ConvertedValue * Vdd / Vdd_convert_value;
     Current_Temp = (V25 - Vtemp_sensor)/Avg_Slope + 25;

2、VDDA的电压范围
    STM32的数据手册规定,VDD与VDDA之间的压差不能大于300mV。ADC的工作电压范围在2.4V~3.6V,供电电压VDD范围在2.0V~3.6V.

使用特权

评论回复
9
powerful1|  楼主 | 2015-2-27 15:02 | 只看该作者
================================= DMA ================================
1、DMA普通模式和循环模式的区别
   循环模式:用于处理一个环形的缓冲区,每轮传输结束时数据传输 的配置会自动地更新为初始状态,DMA传输会连续不断地进行。
   普通模式:在DMA传输结束时,DMA通道被自动关闭,进一步的 DMA请求将不被满足。

2、DMA传输需要指定的条件:
   传输源:DMA控制器从传输源读出数据;
   传输目标:DMA控制器将数据传输的目标;
   触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输。可以用来控制传输的启动条件。

使用特权

评论回复
10
energy1| | 2015-2-27 15:52 | 只看该作者
讲了好多外设,不错的总结

使用特权

评论回复
11
搞IT的| | 2015-2-28 16:50 | 只看该作者
DMA普通模式和循环模式的区别 这个我一直都没弄懂!!

使用特权

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

本版积分规则

88

主题

430

帖子

4

粉丝