你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX的一些问题和想法

[复制链接]
cow1000 提问时间:2015-6-19 00:26 /
本帖最后由 cow1000 于 2015-6-19 00:29 编辑

最近摸索了下STM32CubeMX这个新事物,用的板子是F0discovery(换成103RB的芯片,飞了几根电源线),MDK4.70a。
好了,先说下我的实验,用PA0的按键控制PC8的LED点亮,
按软件的图形界面操作,分配好管脚、建立好时钟、设置IO的属性、生成工程、编写按键处理程序(就IO检测,没用中断方式)、编译下载,
哇,真的好简单,完全不用去设置时钟啦,IO怎么配置啦,
反正一进去,调用下面三个函数,搞定。
HAL_GPIO_ReadPin
HAL_GPIO_WritePin
HAL_Delay
真的很方便,根本不用去关心一大堆的配置指令,这也是Cube的意义所在(移植方面没玩到,不发言了)。

可问题还是有的,下完一次程序后,MDK通过stlink居然找不到芯片了,不能下载了,弹出个错误提示框出来,
后来百度了下,说是MDK版本问题,更新到4.60就好了;又说是芯片进入休眠状态,要硬件复位才能连上。。。
没办法,那就每次点下载前,按着复位键去点下载,几秒后松开复位键,程序倒是能下进去了,于是真的以为芯片是进入了休眠


可不死心,我说你CubeMX不能自作主张帮我进入休眠吖,就找了一通源程序,可也没发现哪里设置了,当然对HAL库不熟,也不太确定
后来玩定时器的实验,重新再来时,发现TIM1上有个SYS项,进去看看,发现居然要手动去设置debug模式,
选了SWD,指定了PA13、PA14后,问题解决啦。


按惯性思维,只要我没去配置的引脚,就应该是上电复位的功能,CubeMX真是带来惊喜啊,唉。。。

OK,说第二个,研究了下hal_gpio库,只有对单一引脚的位操作指令,缺少了对应3.5固件库整端口读、写指令GPIO_ReadInputData、GPIO_Write
不知道这真是一个缺陷,还是我没找到,请大侠指点下,谢谢。

基于hal_gpio这个情况,我想着要不要这样来用Cube:
用它来建立工程,然后再加入3.5固件库,平时写代码时,就用3.5的好了,毕竟熟悉啊,
只要stm32f10x.h这个文件里面的底层定义没变的话,我觉得是可行的,不知大侠们有什么想法没有
当然,这样做就失去了移植方便的优势了





收藏 1 评论7 发布时间:2015-6-19 00:26

举报

7个回答
creep 回答时间:2015-6-19 08:47:14
HAL库和标准库的确有点不同,一些底层的函数封装的没有标准库那样方便。不过你说的GPIO操作整个端口还是可以实现的。比如下面的代码可以实现一次读取写入这个端口的数据。
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
  2.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_RESET);
  3.         HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_All);
复制代码


是的,如果不习惯HAL的话,你可以直接模仿标准库那样写一些底层的操作函数,这是完全没有问题的,但感觉也不是很有必要。
jacobfeng 回答时间:2015-6-19 08:47:32
写这么多 ,支持一下
小蚂蚁快溜跑 回答时间:2015-6-19 13:35:35
跟着学习了,顶一下
cow1000 回答时间:2015-6-20 15:42:09
creep 发表于 2015-6-19 08:47
HAL库和标准库的确有点不同,一些底层的函数封装的没有标准库那样方便。不过你说的GPIO操作整个端口还是可 ...

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;
  }

没达到GPIO_Write的同样效果,
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET)
只是把GPIOC所有端口置1而已,如果我要输出0x5555,还是做不到。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}

typedef enum
{
  GPIO_PIN_RESET = 0,
  GPIO_PIN_SET
}GPIO_PinState;

看得出来返回值只有0或1两种状态而已
creep 回答时间:2015-6-20 16:41:42
cow1000 发表于 2015-6-20 15:42
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Chec ...

往IO口写一个0x5555,你这个需求如果实际上使用的很多,那还是直接操作寄存器吧,简单方便快捷。
pewill 回答时间:2015-6-25 19:11:27
不错啊
shanji 回答时间:2015-7-13 15:13:04
还是以前的库好用

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版