用F1-霸道视频学STM32F030R8,发现有很多不一样的地方,到了位带操作这里卡住了,没找到 位带这块资料,是不是M0不支持位带操作?翻出F429挑战者,可实现位带操作。
在网上找了几个资料看了一下,从新修改了代码如下:
#ifndef __LED_H__
#define __LED_H__
#include "stm32f0xx.h"
#define LED_Pin GPIO_Pin_7
#define LED_Port GPIOC
#define LED_CLK RCC_AHBPeriph_GPIOC
#define On 1
#define Off 0
typedef struct _16_Bits_Struct
{
uint16_t bit0 : 1;
uint16_t bit1 : 1;
uint16_t bit2 : 1;
uint16_t bit3 : 1;
uint16_t bit4 : 1;
uint16_t bit5 : 1;
uint16_t bit6 : 1;
uint16_t bit7 : 1;
uint16_t bit8 : 1;
uint16_t bit9 : 1;
uint16_t bit10 : 1;
uint16_t bit11 : 1;
uint16_t bit12 : 1;
uint16_t bit13 : 1;
uint16_t bit14 : 1;
uint16_t bit15 : 1;
} Bits_16_TypeDef;
#define LED0 (((Bits_16_TypeDef *)(&(LED_Port->ODR)))->bit7)//输出
#endif初始化以后 LED0=On;和LED0=Off; 是可以亮灭的。
这个代码原作者说F0/F1/F4都可以使用,我分析代码还是在操作ODR寄存器,跟位带没关系。
请问:1.上边代码和直接操ODR寄存器作有什么不同?
2.位带操作比较麻烦(比寄存器),为什么ST官方还要在F1/F4(我知道的)加上位带区,位带操作的好处是什么?
我在网上看到这么一段话:虽然很多产品提供了访问每个管脚的寄存器,但只有位带确保访问某个管脚的时候一定不会影响其他管脚,即使寄存器的值有问题。 |