• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

利用STM32的位带操作在keil5环境不能直接赋值操作?

我云心涯 2017-11-15 浏览量:2150

如题,写了一个12864程序,

利用过正点原子的sys.h头文件进行过GPIO口位定义

但在进行这样的操作时不成立,但编译环境不会报错

    LCD_SDA = byte & 0x80;

这样做就是好的
	if((byte&0x80) == 0x80)
		LCD_SDA = 1;
	else 
		LCD_SDA = 0;

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你看看sys.h的定义有没有问题。我用过是没问题的,不然你自己制作sys.h也可以。比如

    ///////////////////////////////////////////////////////////////  
    //位带操作,实现51类似的GPIO控制功能  
    //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).  
    //IO口操作宏定义  
    #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))   
    #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))   
    #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))   
    //IO口地址映射  
    #define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C   
    #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C   
    #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C   
    #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C   
    #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C   
    #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C      
    #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C      
      
    #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808   
    #define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08   
    #define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008   
    #define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408   
    #define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808   
    #define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08   
    #define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08   
       
    //IO口操作,只对单一的IO口!  
    //确保n的值小于16!  
    #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出   
    #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入   
      
    #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出   
    #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入   
      
    #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出   
    #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入   
      
    #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出   
    #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入   
      
    #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出   
    #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入  
      
    #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出   
    #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入  
      
    #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出   
    #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入  
    上面的代码用宏定义计算出位带地址。不喜欢它的名字的话可以换成你自己的。我之前是写一个程序把这些格式化输出到串口,然后保存文件就直接得到地址的宏定义了,就不需要在计算,稍微省点时间。输出的方法是加入上面的宏定义,然后print。比如printf("#define PAout%d  %d\n",i,PAout(i));这样就直接输出PAoutx对应的地址的宏定义代码.

    • 发布于 2017-11-16
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :没有找到 回复

其他答案 数量:9
  • 看看代码优化等级,可能被优化掉了
    • 发布于2017-11-16
    • 举报
    • 评论 2
    • 0
    • 0
我云心涯 回复了 chownn :怎么判断是被优化掉了 回复
电子老工程师 回复了  :有关ON的Pb - Free策略和焊接细节的更多信息,请下载on Semiconductor焊接和安装技术参考手册,SOLDERRM/D 回复

  •  LCD_SDA是BOOL类型的参数吗,BOOL类型在大部分编译器中不能被byte&0x80这种char型直接赋值,因为会产生很多问题。楼主下
    面那个判断挺不错啊,逻辑清晰,程序处理也方便。

    • 发布于2017-11-16
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有找到 回复

  • 这样操作不行,可以io口的高低电平可以用宏定义来
    • 发布于2017-11-16
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :尺寸图已发QQ 回复

  • 不同的STM32支持的位带操作不同.

    M0的不支持.

    M3/M4都支持.

    • 发布于2017-11-17
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :可能与中断程序跑飞有关,具体问题具体分析:例如:启动文件中TIM7对应的中断服务程序的名称写成了IIM7了,这种情况也会造成程序跑飞 回复

  • 要看一下LCD_SDA的数据类型,可能不支持这种赋值方法
    • 发布于2017-11-17
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :尾缀2的是尾缀1的升级版,附件链接是资料说明 回复

  • 不成立是什么意思?前面那个操作也是合法的,只是不管byte是什么数,LCD_SDA 总是输出的0 。
    • 发布于2017-11-17
    • 举报
    • 评论 0
    • 0
    • 0

我云心涯 回复了 @曲终人散@ :不一样,但是代码在51的环境下运行通过,我移植到32上只是把IO口定义以及KEIL报警告的部分改动了 回复

  • Keil编译器貌似不太支持BOOL类型变量,容易出问题,如果&的两个对象其中一个是8位字节变量的话,则返回的就是字节变量。

    • 发布于2017-11-30
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :PEX8714-AB80BI G 通道不一样,需确认 回复

  • STM32不支持这种操作。你可以看看寄存器中的说明
    • 发布于2017-11-15
    • 举报
    • 评论 1
    • -1
    • 0
电子老工程师 回复了  :F具体含义没有说明,带F和不F的是两个不同的料,带F的是无面反锁,有F的是有面反锁 回复

相关问题

问题达人换一批

利用STM32的位带操作在keil5环境不能直接赋值操作?