cow1000 发表于 2015-6-19 00:26:28

STM32CubeMX的一些问题和想法

本帖最后由 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这个文件里面的底层定义没变的话,我觉得是可行的,不知大侠们有什么想法没有
当然,这样做就失去了移植方便的优势了





creep 发表于 2015-6-19 08:47:14

HAL库和标准库的确有点不同,一些底层的函数封装的没有标准库那样方便。不过你说的GPIO操作整个端口还是可以实现的。比如下面的代码可以实现一次读取写入这个端口的数据。
      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_RESET);
      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

还是以前的库好用
页: [1]
查看完整版本: STM32CubeMX的一些问题和想法