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

查看: 2792|回复: 7

STM32CubeMX的一些问题和想法

[复制链接]

1

主题

11

回帖

0

蝴蝶豆

初级会员

最后登录
2018-11-28
发表于 2015-6-19 00:26:28 | 显示全部楼层 |阅读模式
本帖最后由 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这个文件里面的底层定义没变的话,我觉得是可行的,不知大侠们有什么想法没有
当然,这样做就失去了移植方便的优势了





<
回复

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 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的话,你可以直接模仿标准库那样写一些底层的操作函数,这是完全没有问题的,但感觉也不是很有必要。
回复 支持 反对

使用道具 举报

12

主题

207

回帖

0

蝴蝶豆

高级会员

最后登录
2020-4-27
发表于 2015-6-19 08:47:32 | 显示全部楼层
写这么多 ,支持一下
回复 支持 反对

使用道具 举报

17

主题

341

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-2-26
发表于 2015-6-19 13:35:35 | 显示全部楼层
跟着学习了,顶一下
回复 支持 反对

使用道具 举报

1

主题

11

回帖

0

蝴蝶豆

初级会员

最后登录
2018-11-28
 楼主| 发表于 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两种状态而已
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 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,你这个需求如果实际上使用的很多,那还是直接操作寄存器吧,简单方便快捷。
回复 支持 反对

使用道具 举报

1

主题

19

回帖

0

蝴蝶豆

高级会员

最后登录
2018-9-11
发表于 2015-6-25 19:11:27 | 显示全部楼层
不错啊
回复 支持 反对

使用道具 举报

25

主题

455

回帖

63

蝴蝶豆

金牌会员

最后登录
2020-9-21
发表于 2015-7-13 15:13:04 | 显示全部楼层
还是以前的库好用
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版