求助:关于使用STM32V3.5固件库

[复制链接]
13023|17
 楼主| dwlovehome 发表于 2011-7-27 15:26 | 显示全部楼层 |阅读模式
本帖最后由 dwlovehome 于 2011-7-27 15:40 编辑

是这样子的,最近买了一个板子,是例说STM32出的板子。
板子的Demo中,有个设置响应优先级和抢断优先级的函数
他使用的头文件是#include <stm32f10x_lib.h>
  1. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  
  2. {
  3. 。。。。。。。
  4. NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级                  
我自己下载了一个STM32 V3.5的固件库。
我包含的头文件是#include "stm32f10x.h"
也想使用这个函数来设置响应优先级和抢断优先级
但是会出现IPR没有定义这个问题。
error #136   struct"<unnamed>"has no field "IPR"
后来找了半天,发现IPR实在stm32f10x_map.h
中定义的一个结构体
  1. typedef struct
  2. {
  3.   vu32 ISER[2];
  4.   u32  RESERVED0[30];
  5.   vu32 ICER[2];
  6.   u32  RSERVED1[30];
  7.   vu32 ISPR[2];
  8.   u32  RESERVED2[30];
  9.   vu32 ICPR[2];
  10.   u32  RESERVED3[30];
  11.   vu32 IABR[2];
  12.   u32  RESERVED4[62];
  13.   vu32 IPR[15];
  14. } NVIC_TypeDef;
但是stm32f10x_map.h这个文件我在v3.5的库里面没有找到,现在怎么办哈
我自己在文件中加上上述的定义也不行。
香水城 发表于 2011-7-27 17:22 | 显示全部楼层
在目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的core_cm3.h中有这样的定义,你可以借用:


  1. typedef struct
  2. {
  3.   __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */
  4.        uint32_t RESERVED0[24];                                   
  5.   __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */
  6.        uint32_t RSERVED1[24];                                    
  7.   __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */
  8.        uint32_t RESERVED2[24];                                   
  9.   __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */
  10.        uint32_t RESERVED3[24];                                   
  11.   __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */
  12.        uint32_t RESERVED4[56];                                   
  13.   __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */
  14.        uint32_t RESERVED5[644];                                 
  15.   __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
  16. }  NVIC_Type;                                               

 楼主| dwlovehome 发表于 2011-7-27 20:52 | 显示全部楼层
2# 香水城

您好,请问下这个该怎么借用啊,我还是小白一个,希望可以指点下,比如这个代码怎么改下;
全部代码如下:

  1. #include <stm32f10x_lib.h>
  2. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  
  3. {
  4. u32 temp;
  5. u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址
  6. u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
  7. IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
  8. MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
  9. temp=NVIC_PreemptionPriority<<(4-NVIC_Group);   
  10. temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
  11. temp&=0xf;//取低四位
  12. if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
  13. else NVIC->ISER[1]|=1<<(NVIC_Channel-32);   
  14. NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级                  
  15. }
CreatAll 发表于 2011-7-28 09:55 | 显示全部楼层
简单点就是在你的文件上面 #include “core_cm3.h"。但一定要主要包含这个文件的路径
========================================================
我也很纳闷,你说ST公司搞的这个库,为什么变来变去的???

估计很多人在换库的时候都遇到这样的问题!!
 楼主| dwlovehome 发表于 2011-7-28 12:24 | 显示全部楼层
4# CreatAll
包含了#include"core_cm3.h"这个库没用。
关键是下面代码里面的IPR未定义。"core_cm3.h"里面定义的是IP

  1. NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先
香水城 发表于 2011-7-28 12:30 | 显示全部楼层
书中提供的例子是按照写书当时的固件库版本而写的,如果你自己要把这些例子移植到新版本的固件库上,就应该先搞懂原有的例子是怎么工作的,然后再考虑移植;不要还没有学会走路,就想学跑步,要循序渐进的,:D
wangzhihai1986 发表于 2011-7-28 12:33 | 显示全部楼层
你哪个库是3.0以前的版本了,3.0以后都叫做标准外设库了,比一前的明了多了,我最开始就是用2.0.3的,后来升级到3.1.2,也是出了很多问题,感觉这两个版本差别太大,没法升级似的,后来搞好后,感觉新版本很不错。给你个完整的程序学习下,呵呵。

UCOS2.86&FATFS0.08b(多个任务多个信号量).rar

425.57 KB, 下载次数: 304

yinyangdianzi 发表于 2011-7-28 13:37 | 显示全部楼层
geili求证
CreatAll 发表于 2011-7-28 16:07 | 显示全部楼层
sorry,我4楼的回答太草率了

不过你这样的问题,最好还是多花点时间研究透,要不你不明白每个定义的具有意思,要换库,而又要借用以前库的程序估计够呛

就像你这个问题其实只要明白 NVIC_TypeDef的各个定义就OK了,但是要换的麻烦估计头疼……
 楼主| dwlovehome 发表于 2011-8-1 12:49 | 显示全部楼层
谢谢大家了,问题解决了,感激不尽
yanhaiyuyuyu 发表于 2012-4-26 21:30 | 显示全部楼层
受教了……
probug 发表于 2012-5-7 15:54 | 显示全部楼层
学到些了
wjwj1212 发表于 2013-3-18 23:59 | 显示全部楼层
求楼主解决的方法。NVIC->IPR[IPRADDR]|=temp<<IPROFFSET ..\SYSTEM\sys\sys.c(76): error:  #136: struct "<unnamed>" has no field "IPR"
wjwj1212 发表于 2013-3-19 00:01 | 显示全部楼层
dwlovehome 发表于 2011-8-1 12:49
谢谢大家了,问题解决了,感激不尽

求楼主解决的方法。NVIC->IPR[IPRADDR]|=temp<<IPROFFSET ..\SYSTEM\sys\sys.c(76): error:  #136: struct "<unnamed>" has no field "IPR"
山水之乐 发表于 2013-5-8 20:34 | 显示全部楼层
wjwj1212 发表于 2013-3-19 00:01
求楼主解决的方法。NVIC->IPR|=temp

void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)         
{
        u32 temp;       
        MY_NVIC_PriorityGroupConfig(NVIC_Group);//ÉèÖ÷Ö×é
        temp=NVIC_PreemptionPriority<<(4-NVIC_Group);          
        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
        temp&=0xf;//È¡µÍËÄλ

        if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//ʹÄÜÖжÏλ(ÒªÇå³ýµÄ»°,Ïà·´²Ù×÷¾ÍOK)
        else NVIC->ISER[1]|=1<<(NVIC_Channel-32);   

        NVIC->IP[NVIC_Channel]|=temp;//ÉèÖÃÏìÓ¦ÓÅÏȼ¶ºÍÇÀ¶ÏÓÅÏȼ¶                                                           
}
改为这样是不是就可以呢……
__小黑先生 发表于 2013-8-9 15:32 | 显示全部楼层
chuangpu 发表于 2013-8-9 20:24 | 显示全部楼层
学到了一点东西   谢谢了   楼主  表示顶一个
云淡风轻2011 发表于 2013-9-14 15:51 | 显示全部楼层
楼主,你好!我跟你遇到的问题是一模一样的,我想问一下,你是怎么解决这个问题的?求教!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

0

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