[STM32F1] Cube库真心不好用

[复制链接]
6154|27
 楼主| jeffkuang 发表于 2015-5-23 15:45 | 显示全部楼层 |阅读模式
pi, IO, GPIO, gp, ST
今天使用了一下CubeMx,在使用stm32f1xx_hal_gpio与原来的stm32f10x_gpio差别有点,
原来的库好用,
比如说我要操作多个IO
原来的程序为:GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);
在Cube库里竟然没有这个函数了,需要调用三次:
HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
怎么为这样子呢?
还是说我没有理解对吗?
 楼主| jeffkuang 发表于 2015-5-23 15:47 | 显示全部楼层
竟然代理商推荐我使用Cube库,无语呀!:L
wind~风 发表于 2015-5-23 18:06 | 显示全部楼层
HAL_GPIO_WritePin(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6,1);就可以了,或者最后一个参数是1/0,SET/RESET,都一样



//我猜的,你好好看看函数参数
sting_yang 发表于 2015-5-23 18:24 | 显示全部楼层
用自己习惯的库吧!
mark0668 发表于 2015-5-23 18:54 | 显示全部楼层
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
  }
}


嗯,他源码是这样的
mark0668 发表于 2015-5-23 18:56 | 显示全部楼层
GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);

按这写法是可以的;

HAL_GPIO_WritePin(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);
戈卫东 发表于 2015-5-23 19:48 | 显示全部楼层
我拿它做管脚分配,做完了程序还是用寄存器写。。。。。
fjjjnk1234 发表于 2015-5-23 19:55 | 显示全部楼层
只能说用得不习惯吧
 楼主| jeffkuang 发表于 2015-5-23 19:57 | 显示全部楼层
本帖最后由 jeffkuang 于 2015-5-23 20:04 编辑
mark0668 发表于 2015-5-23 18:56
GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);

按这写法是可以的;

源码这样写的:
/**
  * @brief  Sets or clears the selected data port bit.
  *
  * @NOTE   This function uses GPIOx_BSRR register to allow atomic read/modify
  *         accesses. In this way, there is no risk of an IRQ occurring between
  *         the read and the modify access.
  *               
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: specifies the port bit to be written.
  *          This parameter can be one of GPIO_PIN_x where x can be (0..15).
  * @param  PinState: specifies the value to be written to the selected bit.
  *          This parameter can be one of the GPIO_PinState enum values:
  *            @arg GPIO_BIT_RESET: to clear the port pin
  *            @arg GPIO_BIT_SET: to set the port pin
  * @retval None
  */
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
mark0668 发表于 2015-5-23 20:03 | 显示全部楼层
  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
  }

你看的明白这两句寄存器是什么吗?
 楼主| jeffkuang 发表于 2015-5-23 20:05 | 显示全部楼层
mark0668 发表于 2015-5-23 20:03
if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;

我应该说的是上面那个参数,刚才标错了。新库的源码与老库不一样。
mark0668 发表于 2015-5-23 20:32 | 显示全部楼层
参数这个集在一起好啊,不用多个函数
 楼主| jeffkuang 发表于 2015-5-23 20:46 | 显示全部楼层
mark0668 发表于 2015-5-23 20:03
if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;

看明白了,谢了。
mmuuss586 发表于 2015-5-23 23:36 | 显示全部楼层
McuPlayer 发表于 2015-5-24 01:24 | 显示全部楼层
Cube库的思路,更系统,更多考虑到了移植
我觉得是,老项目维持老库,新项目尽量用新库
lvyunhua 发表于 2015-5-24 12:35 | 显示全部楼层
习惯就好,以后是趋势。
jonyzhu 发表于 2015-5-24 19:57 | 显示全部楼层
没事儿,吐习惯就好了。
 楼主| jeffkuang 发表于 2015-5-25 10:07 | 显示全部楼层
McuPlayer 发表于 2015-5-24 01:24
Cube库的思路,更系统,更多考虑到了移植
我觉得是,老项目维持老库,新项目尽量用新库 ...

谢谢你的建议。
Marco-Marco 发表于 2015-5-25 10:40 | 显示全部楼层
jeffkuang 发表于 2015-5-23 15:47
竟然代理商推荐我使用Cube库,无语呀!

我是代理商,仍然推荐你用Cube。
1、不否认关键时刻调试仍然要看寄存器。
2、各个系列F0-F4,L0,L1的软件真正做到完全兼容,函数名完全一模一样可以替代。
3、时钟配置,资源管脚配置的便捷性不用说了,图形化嵌入式是趋势。
4、第一次用某个系列(比如F0,)会下载一个库,库里面的例程很重要,也很清晰。
5、买ST MCU芯片欢迎找我,胡炳祥 QQ : 2355925820.  phn:13802244305.  @赛易
 楼主| jeffkuang 发表于 2015-5-25 12:18 | 显示全部楼层
Marco-Marco 发表于 2015-5-25 10:40
我是代理商,仍然推荐你用Cube。
1、不否认关键时刻调试仍然要看寄存器。
2、各个系列F0-F4,L0,L1的软 ...

F0~F4函数名不一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

120

帖子

0

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