本帖最后由 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这个文件里面的底层定义没变的话,我觉得是可行的,不知大侠们有什么想法没有 当然,这样做就失去了移植方便的优势了 |
【Nucleo STM32F767ZI】 STM32CubeMX + USB读取U盘文件例程
【NUCLEO-L476RG开发】芯片内部温度传感器使用(ADC+DMA+USART)
【stm32F429开发日志】使用STM32CubeMX配置STM32F429_USB_HID
【NUCLEO-L496ZG评测】STM32CubeMX+内部RAM模拟U盘 USB DEVICE MSC的实现
【Nucleo STM32F767ZI】 STM32CubeMX + SDIO读取TF卡例程
STM32CubeMX v.5.0怎么不能下载了
STM32F769I-DISCO评测之(六)使用STM32CubeMX快速开发应用 ...
STM32CubeMX加载库文件速度太慢
STM32CubeMX 5.6.0 TIM OC 模式列表不全问题
【NUCLEO-L496ZG评测】STM32CubeMX+实现ESP8266连接到云端API获取天气
是的,如果不习惯HAL的话,你可以直接模仿标准库那样写一些底层的操作函数,这是完全没有问题的,但感觉也不是很有必要。
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两种状态而已
往IO口写一个0x5555,你这个需求如果实际上使用的很多,那还是直接操作寄存器吧,简单方便快捷。