请教关于STM32的问题

2025-04-24 20:30:31
推荐回答(3个)
回答1:

GPIOB在这里是一个结构体指针,是指向GPIO_TypeDef这样的一个结构体,并且强制将该结构体指针指向的地址为GPIOB_BASE,一般情况下是不允许对绝对地址空间的操作,但是在这里可以。

下面的宏定义
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
((PERIPH) == GPIOG))
也是合法的,后面的斜杠\标识连接着的意思,等效于:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ...)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));这句主要是判断传进函数中的参数GPIOx是否有效,因为GPIOx必须是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG这几个当中的其中一个,否则会被认为是无效的参数。

assert_param(xxxxxxxx)就是判断参数是否有效,但在实际情况下并不使用,因为宏定义中:
#ifdef USE_FULL_ASSERT
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
因为一般情况下USE_FULL_ASSERT是没有被定义的,assert_param(xxxxxxxx)就等于((void)0),什么也没有做。

回答2:

我理解的话,BufferSize是要传输的数量,比如你的u16 buff[10],DMA传输要添满这个单元的话,那就设置BufferSize=10,这样就添满了。当然低于10大于0的任意数字都可以。
希望能解决您的问题。

回答3:

需要帮你写程序吗