关于SD-Fatfs

等。。。待 发表了文章 • 5 个评论 • 1411 次浏览 • 2018-04-19 13:27 • 来自相关话题

cubemx更新后,关于SD-Fatfs的生成代码无法直接使用,需要加两个回调函数才能正常使用void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_WriteCpltCallback();
}
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_ReadCpltCallback();
} 查看全部

cubemx更新后,关于SD-Fatfs的生成代码无法直接使用,需要加两个回调函数才能正常使用

void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_WriteCpltCallback();
}
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_ReadCpltCallback();
}


WIN7 装VirtualBox, 想解决串口端口问题

TRun 回复了问题 • 2 人关注 • 3 个回复 • 1268 次浏览 • 2018-01-25 19:09 • 来自相关话题

STM32CubeMX在MacOS上双击没反应无法安装的解决办法。

无问 发表了文章 • 2 个评论 • 2058 次浏览 • 2018-01-02 19:28 • 来自相关话题

下载了STM32CubeMX for Mac OS版本,发现双击安装程序没有任何反应,百度也没能找到有效的解决方法,就尝试在安装包上右键-->“显示包内容”,找到“Contents/MacOs/SetupSTM32CubeMX-4_23_0_macos”这个文件,然后把这个文件拖到“终端”回车,哈哈,安装界面出来了,然后根据提示一步步安装成功了。有同样问题的同学可以试一下。 查看全部

下载了STM32CubeMX for Mac OS版本,发现双击安装程序没有任何反应,百度也没能找到有效的解决方法,就尝试在安装包上右键-->“显示包内容”,找到“Contents/MacOs/SetupSTM32CubeMX-4_23_0_macos”这个文件,然后把这个文件拖到“终端”回车,哈哈,安装界面出来了,然后根据提示一步步安装成功了。有同样问题的同学可以试一下。







HY-SRF05超声波测距模块问题,求共享交流

popdes 回复了问题 • 3 人关注 • 2 个回复 • 1856 次浏览 • 2017-12-23 07:11 • 来自相关话题

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+FATFS(SDIO)

开始现在-s 发表了文章 • 1 个评论 • 2801 次浏览 • 2017-12-11 22:31 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库) 设置:    1、必须开启DMA(实测不开启测试不成功),但是F1只能开启一个DMA,我开启了RX接收DMA,如果是F4 的话可以开启TX和RX的DMA,注意DMA的中断优先级要低于SDIO的通用中断!    2、FATFS的配置    3、程序设计    主要是修改sd_diskio.c文件里面的SD_read()和SD_write()函数,写函数采取普通的方式,读为DMA方式,而且在SDIO dma配置的时候去掉将tx设置为dma的那句话!    /* Several peripheral DMA handle pointers point to the same DMA handle.     Be aware that there is only one channel to perform all the requested DMAs. */    /* Be sure to change transfer direction before calling  //官方提示的另外一种方法,但是我偷懒     HAL_SD_ReadBlocks_DMA or HAL_SD_WriteBlocks_DMA. */    __HAL_LINKDMA(sdHandle,hdmarx,hdma_sdio);//    __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdio); 去掉这句话写函数:BSP_SD_WriteBlocks((uint32_t*)buff,  (uint32_t)(sector*512), count, SD_DATATIMEOUT)读函数:BSP_SD_ReadBlocks_DMA((uint32_t*)buff, (uint32_t) (sector*512), count)注意sector需要乘以512,表示起始读写地址,而sector表示从第几个块开始读,count表示读多少块,不是字节数!    4、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库) 

设置:

    1、必须开启DMA(实测不开启测试不成功),但是F1只能开启一个DMA,我开启了RX接收DMA,如果是F4 的话可以开启TX和RX的DMA,注意DMA的中断优先级要低于SDIO的通用中断!


    2、FATFS的配置


    3、程序设计

    主要是修改sd_diskio.c文件里面的SD_read()和SD_write()函数,写函数采取普通的方式,读为DMA方式,而且在SDIO dma配置的时候去掉将tx设置为dma的那句话!

    /* Several peripheral DMA handle pointers point to the same DMA handle.

     Be aware that there is only one channel to perform all the requested DMAs. */

    /* Be sure to change transfer direction before calling  //官方提示的另外一种方法,但是我偷懒

     HAL_SD_ReadBlocks_DMA or HAL_SD_WriteBlocks_DMA. */

    __HAL_LINKDMA(sdHandle,hdmarx,hdma_sdio);

//    __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdio); 去掉这句话


写函数:BSP_SD_WriteBlocks((uint32_t*)buff,  (uint32_t)(sector*512), count, SD_DATATIMEOUT)

读函数:BSP_SD_ReadBlocks_DMA((uint32_t*)buff, (uint32_t) (sector*512), count)

注意sector需要乘以512,表示起始读写地址,而sector表示从第几个块开始读,count表示读多少块,不是字节数!


    4、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+无法使用Jlink仿真问题

开始现在-s 发表了文章 • 2 个评论 • 1180 次浏览 • 2017-12-11 14:08 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)3、硬件: 各仿真器问题描述: 仿真几秒钟自动跳出解决办法:     1、首先自行研究HAL的MSP回调函数的框架,弄明白回调函数,这个对于使用HAL库开发很重要!    2、软件最好这样设置:按ALT+P键,出现工程设置页面:为每个外设单独生成 .c 文件,这样Msp函数与初始化函数就会在一起方便查看。    3、具体解决办法    打开HAL_Init()函数,找到HAL_MspInit()函数,将HAL_MspInit()函数里面的 __HAL_AFIO_REMAP_SWJ_DISABLE();这句话注释掉!注意每次重新生成过程的时候,这句话就会重新起作用,所以小伙伴们要留意!    4、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

3、硬件: 各仿真器

问题描述: 仿真几秒钟自动跳出

解决办法: 

    1、首先自行研究HAL的MSP回调函数的框架,弄明白回调函数,这个对于使用HAL库开发很重要!

    2、软件最好这样设置:按ALT+P键,出现工程设置页面:

捕获.JPG

为每个外设单独生成 .c 文件,这样Msp函数与初始化函数就会在一起方便查看。

    3、具体解决办法

    打开HAL_Init()函数,找到HAL_MspInit()函数,将HAL_MspInit()函数里面的 __HAL_AFIO_REMAP_SWJ_DISABLE();这句话注释掉!注意每次重新生成过程的时候,这句话就会重新起作用,所以小伙伴们要留意!

    4、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!




STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+USB 虚拟串口+SD卡、串行Flash模拟U盘

开始现在-s 发表了文章 • 1 个评论 • 3226 次浏览 • 2017-12-11 13:59 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)3、硬件: STM32模拟USB设备:虚拟串口 CDC、HID、MSC问题描述: 官方生成的代码有的人说电脑没有反应,不会出现USB设备!解决办法:1、查看硬件原理图    注意D+要设置为高电平,全速USB,这时候需要PD3引脚为低电平,当然了你也可以在软件里设置DP为上拉,可惜最新的1.6库是无法设置DP引脚的,所以需要我们自己根据自己的硬件原理图查看下,DP引脚是否上拉为3.3V!    也有人说是Vbus引脚的问题,应该在设置里面把Vbus失效不使能,可惜1.6的库没有这个设置,好在我硬件里面已经上拉为5V,将Vbus失效了!    2、USB虚拟串口:主要就是使用CDC_Receive_FS( UserRxBuffer,(uint32_t *)(sizeof(UserRxBuffer)));和    CDC_Transmit_FS((uint8_t*)UserRxBuffer,sizeof(UserRxBuffer));这两个函数,感觉不好用,纯粹属于测试,发送和接收成功,感兴趣可以自己研究!    3、HID测试成功,正常读取 polling_interval=USBD_HID_GetPollingInterval(&hUsbDeviceFS);数值,至于具体怎么使用没有深入研究。    4、SD卡模拟U盘:    主要修改生成的usbd_storage_if.c文件里面STORAGE_Read_FS()和STORAGE_Write_FS()函数,注意blk_addr 不需要乘以512(SD卡一个块为512字节),因为不同版本库之间有的乘以512,有的不乘,但是最新的1.6库是不需要乘以512的,blk_addr 就是起始地址的意思,而blk_len表示是读多少块,而不是读多少字节数,大家一定注意!    HAL_SD_WriteBlocks(&hsd, (uint8_t *)buf, blk_addr , blk_len, 1000)    HAL_SD_ReadBlocks(&hsd,(uint8_t *)buf, blk_addr , blk_len, 1000)    5、SPIFLASH模拟U盘暂时没有成功,可能是自己板子的flash有问题,出现无法格式化的情况,还需要继续研究,也希望已经搞好的朋友分享一下!    6、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

3、硬件: STM32模拟USB设备:虚拟串口 CDC、HID、MSC

问题描述: 官方生成的代码有的人说电脑没有反应,不会出现USB设备!

解决办法:

1、查看硬件原理图

捕获.JPG

    注意D+要设置为高电平,全速USB,这时候需要PD3引脚为低电平,当然了你也可以在软件里设置DP为上拉,可惜最新的1.6库是无法设置DP引脚的,所以需要我们自己根据自己的硬件原理图查看下,DP引脚是否上拉为3.3V!

    也有人说是Vbus引脚的问题,应该在设置里面把Vbus失效不使能,可惜1.6的库没有这个设置,好在我硬件里面已经上拉为5V,将Vbus失效了!


    2、USB虚拟串口:

主要就是使用CDC_Receive_FS( UserRxBuffer,(uint32_t *)(sizeof(UserRxBuffer)));和

   CDC_Transmit_FS((uint8_t*)UserRxBuffer,sizeof(UserRxBuffer));这两个函数,感觉不好用,纯粹属于测试,发送和接收成功,感兴趣可以自己研究!


    3、HID测试成功,正常读取 polling_interval=USBD_HID_GetPollingInterval(&hUsbDeviceFS);数值,至于具体怎么使用没有深入研究。


    4、SD卡模拟U盘:

    主要修改生成的usbd_storage_if.c文件里面STORAGE_Read_FS()和STORAGE_Write_FS()函数,注意blk_addr 不需要乘以512(SD卡一个块为512字节),因为不同版本库之间有的乘以512,有的不乘,但是最新的1.6库是不需要乘以512的,blk_addr 就是起始地址的意思,而blk_len表示是读多少块,而不是读多少字节数,大家一定注意!

    HAL_SD_WriteBlocks(&hsd, (uint8_t *)buf, blk_addr , blk_len, 1000)

    HAL_SD_ReadBlocks(&hsd,(uint8_t *)buf, blk_addr , blk_len, 1000)


    5、SPIFLASH模拟U盘暂时没有成功,可能是自己板子的flash有问题,出现无法格式化的情况,还需要继续研究,也希望已经搞好的朋友分享一下!


    6、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!



STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+UCOSIII+STemWin+FreeRTOS 移植

开始现在-s 发表了文章 • 5 个评论 • 3182 次浏览 • 2017-12-11 13:26 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)                UCOSIII 3.03                STemWin 5.32                FreeRTOS 9.00移植中注意的问题:    1、裸机移植STemWin时,TFT液晶屏驱动函数所在文件不能是“LCD.C”和“LCD.h”(不区分大小写),这一步比较重要,因为STemWin的库中有一个“LCD.h”的头文件!    在LCDConf_FlexColor_Template.c文件中的void LCD_X_Config(void)函数里面的最后一句话为:    GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);      我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。GUIDRV_FLEXCOLOR_F66708 这个参数的修改要根据你的TFT屏所使用的    驱动芯片,如我的TFT使用的驱动芯片是“ILI9325”,所以GUIDRV_FLEXCOLOR_F66708。如果你的是“ILI9341”,那么就改成GUIDRV_FLEXCOLOR_F66709。如果是其它型号的驱动芯片则需要查询emWin5.32的用户手册然后进行修改。emWin5.32用户手册    可在“STemWinLibrary532”文件夹中的“STemWinLibrary532\Documentation”目录下找到,该手册是一份PDF文档,打开之后    点开查找功能,输入“GUIDRV_FLEXCOLOR_F66709”便可找到,一般在1002页,具体看下图。    裸机移植使用GUI_X.c,带操作系统使用GUI_X_OS.c!    2、移植UCOS III应该注意的问题:    不能使用HAL_Delay(),因为这与操作系统的时基两者之间会冲突!    自己的函数初始化最好放在BSP函数里面(起始任务AppTaskStart),不要放在建立任务(OSTaskCreate)之前!    3、UCOS III+STemWin移植    必须使用GUI_X_OS.c,修改int GUI_X_GetTime(void)函数为:    int GUI_X_GetTime(void)    {        OS_ERR      err;    return OSTimeGet(&err);    }    这样就可以用GUI_Delay()与OSTimeDly (  )就都可以使用,不然就会出现死机情况!不能使用HAL_Delay(),因为这与操作系统的时基两者之间会冲突!当然你也可以自己设计延时函数,但是这样的延时函数只有延时作用,不会发起任务调度!    4、FreeRTOS移植相对来说不会出现大问题,而且HAl_Delay与osDelay也可以共用!可见Cubemx的好处!下面给出设置需要注意的地方。时基如果选择Systick会有警告,经过实测是没有问题的,当然了你也可以选择其他时基,比如TIM2。任务的建立,名字和符号,又一次可见Cubemx的强大!只需要在建立好的任务里面实现自己的函数即可,省去复杂的移植过程!    并且TreeRTOS+STemWin移植的时候,GUI_X_OS.c文件一点不需要修改,因为ST官方现在是主推使用FreeRTos的,因为免费啊!可见免费的力量!    5、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

                UCOSIII 3.03

                STemWin 5.32

                FreeRTOS 9.00

移植中注意的问题:


    1、裸机移植STemWin时,TFT液晶屏驱动函数所在文件不能是“LCD.C”和“LCD.h”(不区分大小写),这一步比较重要,因为STemWin的库中有一个“LCD.h”的头文件

    在LCDConf_FlexColor_Template.c文件中的void LCD_X_Config(void)函数里面的最后一句话为:

    GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);  

    我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。GUIDRV_FLEXCOLOR_F66708 这个参数的修改要根据你的TFT屏所使用的

    驱动芯片,如我的TFT使用的驱动芯片是“ILI9325”,所以GUIDRV_FLEXCOLOR_F66708。如果你的是“ILI9341”,那么就改成GUIDRV_FLEXCOLOR_F66709。如果是其它型号的驱动芯片则需要查询emWin5.32的用户手册然后进行修改。emWin5.32用户手册

    可在“STemWinLibrary532”文件夹中的“STemWinLibrary532\Documentation”目录下找到,该手册是一份PDF文档,打开之后

    点开查找功能,输入“GUIDRV_FLEXCOLOR_F66709”便可找到,一般在1002页,具体看下图。

捕获.JPG


    裸机移植使用GUI_X.c,带操作系统使用GUI_X_OS.c!


    2、移植UCOS III应该注意的问题:

    不能使用HAL_Delay(),因为这与操作系统的时基两者之间会冲突!

    自己的函数初始化最好放在BSP函数里面(起始任务AppTaskStart),不要放在建立任务(OSTaskCreate)之前!


    3、UCOS III+STemWin移植

    必须使用GUI_X_OS.c,修改int GUI_X_GetTime(void)函数为:

    int GUI_X_GetTime(void)

    {

        OS_ERR      err;

    return OSTimeGet(&err);

    }

    这样就可以用GUI_Delay()与OSTimeDly (  )就都可以使用,不然就会出现死机情况!不能使用HAL_Delay(),因为这与操作系统的时基两者之间会冲突!当然你也可以自己设计延时函数,但是这样的延时函数只有延时作用,不会发起任务调度


    4、FreeRTOS移植相对来说不会出现大问题,而且HAl_Delay与osDelay也可以共用!可见Cubemx的好处!

下面给出设置需要注意的地方。

时基如果选择Systick会有警告,经过实测是没有问题的,当然了你也可以选择其他时基,比如TIM2。


任务的建立,名字和符号,又一次可见Cubemx的强大!只需要在建立好的任务里面实现自己的函数即可,省去复杂的移植过程!

    并且TreeRTOS+STemWin移植的时候,GUI_X_OS.c文件一点不需要修改,因为ST官方现在是主推使用FreeRTos的,因为免费啊!可见免费的力量!


    5、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+CAN

开始现在-s 发表了文章 • 0 个评论 • 2636 次浏览 • 2017-12-11 11:54 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)问题描述: 官方生成的代码没有滤波器设置,需要自己加入解决办法:1、不能直接在cubemx上面设置CAN的引脚,需要自己选择PB9和PB10,然后设为CANTX和RX2、添加滤波器设置在static void MX_CAN_Init(void)函数里面加入滤波器设置函数:    CAN_FilterConfTypeDef  sFilterConfig;  sFilterConfig.FilterNumber = 0;  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  sFilterConfig.FilterIdHigh = 0x0000;  sFilterConfig.FilterIdLow = 0x0000;  sFilterConfig.FilterMaskIdHigh = 0x0000;  sFilterConfig.FilterMaskIdLow = 0x0000;  sFilterConfig.FilterFIFOAssignment = 0; //收到的报文放在FIFO 0里面  sFilterConfig.FilterActivation = ENABLE;  sFilterConfig.BankNumber = 14;  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)  {    /* Filter configuration Error */    Error_Handler();  }3、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

问题描述: 官方生成的代码没有滤波器设置,需要自己加入


解决办法:

1、不能直接在cubemx上面设置CAN的引脚,需要自己选择PB9和PB10,然后设为CANTX和RX

2、添加滤波器设置


在static void MX_CAN_Init(void)函数里面加入滤波器设置函数:

  

  CAN_FilterConfTypeDef  sFilterConfig;

  sFilterConfig.FilterNumber = 0;

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

  sFilterConfig.FilterIdHigh = 0x0000;

  sFilterConfig.FilterIdLow = 0x0000;

  sFilterConfig.FilterMaskIdHigh = 0x0000;

  sFilterConfig.FilterMaskIdLow = 0x0000;

  sFilterConfig.FilterFIFOAssignment = 0; //收到的报文放在FIFO 0里面

  sFilterConfig.FilterActivation = ENABLE;

  sFilterConfig.BankNumber = 14;


  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)

  {

    /* Filter configuration Error */

    Error_Handler();

  }

3、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+FSMC读写SRAM或者液晶屏的控制芯片

开始现在-s 发表了文章 • 1 个评论 • 2027 次浏览 • 2017-12-11 11:42 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)3、硬件:SRAM:IS62WV51216  1MByte  或者  ILI9341的液晶控制器芯片问题描述:读写SRAM时高字节无效!问题原因:Bytes使能选项没有选择!解决办法:因为SRAM是16位的数据线,需要高8位和低8位分别有效,所以这个选项需要选择上!如果是ILI9341的液晶控制器芯片的控制芯片则需要看您是使用哪根地址线模拟D/CX (数据/信号)的,根据具体情况进行选择!比如在控制液晶屏的时候就没有选择bytes使能,但是也没有出错,因为在数据传输的时候都是发送的8位!所以保险起见,应该将这个选项选上! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

3、硬件:SRAM:IS62WV51216  1MByte  或者  ILI9341的液晶控制器芯片

问题描述:读写SRAM时高字节无效!

问题原因:Bytes使能选项没有选择!

解决办法:

捕获1.JPG

因为SRAM是16位的数据线,需要高8位和低8位分别有效,所以这个选项需要选择上!


如果是ILI9341的液晶控制器芯片的控制芯片则需要看您是使用哪根地址线模拟D/CX (数据/信号)的,根据具体情况进行选择!比如在控制液晶屏的时候就没有选择bytes使能,但是也没有出错,因为在数据传输的时候都是发送的8位!所以保险起见,应该将这个选项选上!

捕获2.JPG


STM32F103ZET(基于秉火开发板)+Cubemx(F1 V1.60库)+IIC+AT24C02(修复官方例程读写死机bug)

开始现在-s 发表了文章 • 3 个评论 • 2966 次浏览 • 2017-12-11 11:08 • 来自相关话题

首先说明下开发条件:1、开发板:秉火霸道,STM32F103ZET2、软件:Cubemx V4.23(F1 V1.60库)3、硬件:AT24C02 256KByte 问题描述:Cubemx生成IIC代码会出现死机问题,或者压根运行不了!问题原因:1、ST为了规避飞利浦IIC专利问题,将STM32的硬件IIC设计的比较复杂,而且稳定性不怎么好,所以一般教程都不推荐使用。2、Cubemx生成的代码有Bug!解决办法:1、设置2、IIC的回调函数里面需要将时钟初始化放在引脚初始化之前!void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c){  GPIO_InitTypeDef GPIO_InitStruct;  if(hi2c->Instance==I2C1)  {  /* USER CODE BEGIN I2C1_MspInit 0 */    __HAL_RCC_I2C1_CLK_ENABLE(); //默认生成的放在了引脚初始化后面!  /* USER CODE END I2C1_MspInit 0 */      /**I2C1 GPIO Configuration        PB6     ------> I2C1_SCL    PB7     ------> I2C1_SDA     */    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);    /* Peripheral clock enable */  /* USER CODE BEGIN I2C1_MspInit 1 */  /* USER CODE END I2C1_MspInit 1 */  }}3、函数的具体应用需要结合AT24C02的数据手册,符合AT24C02的要求!        我们在读写IIC时,即使不知道IIC的协议是什么,直接调用 HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) 这个函数就可以对IIC的设备进行读写,这就是Cubemx的优势!        我先解释下这个函数里面的几个变量:    I2C_HandleTypeDef *hi2c IIC的句柄    uint16_t DevAddress IIC设备的外部地址    uint16_t MemAddress IIC设备的内部地址    uint16_t MemAddSize 读写内部地址的方式,一般使用I2C_MEMADD_SIZE_8BIT方式                        注意只有两种选择:I2C_MEMADD_SIZE_8BIT 或者 I2C_MEMADD_SIZE_16BIT    uint8_t *pData 写入的数组或者指针    uint16_t Size 写入的字节数!    注意:如果是AT24C02,这个字节数不能超过8!!!!!这也叫AT24C02的页写入!当然这是为了提高速度,如果你想不出错也不在乎速度,你可以将字节数设置为1,这样肯定不会出错!    uint32_t Timeout 时间超时4、程序实现    注意:需要在写函数后面加入短延时!uint8_t I2c_Buf_Write[256];uint8_t I2c_Buf_Read[256];uint8_t I2C_Test(void){uint16_t i;i2cStatus=HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000);  //0表示readyprintf("i2cStatus = %d\r\n ", i2cStatus);i2cStatus1=HAL_I2C_GetState(&hi2c1);//32表示ready  HAL_I2C_STATE_READY  = 0x20U,   /*!< Peripheral Initialized and ready for use  */printf("i2cStatus1 = %d\r\n ", i2cStatus1);printf("写入的数据\n\r");for ( i=0; i<256; i++ ) //填充缓冲  {       I2c_Buf_Write[i] = i; HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, i, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&(I2c_Buf_Write[i])), 1, 10000);//一个字节一个字节写,如果需要页写入(不超过8),使用40行的函数// HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, 0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t*)I2c_Buf_Write, 8, 10000);//不能超过8个字节,如果超过需要分开写,for循环里面改为i=i+8 printf("0xX ", I2c_Buf_Write[i]); HAL_Delay(5);//不能少   }  EEPROM_INFO("\n\r写成功\n\r");  HAL_Delay(500); EEPROM_INFO("\n\r读出的数据\n\r");  //将EEPROM读出数据顺序保持到I2c_Buf_Read中//if(HAL_I2C_GetState(&hi2c1) == 0x20 ) //加入检测if( HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000) == HAL_OK)//另外一种检测方法{ HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(EEPROM_Block0_ADDRESS+1 ),0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t *)I2c_Buf_Read, 256, 10000); //读对字节数没有限制}//将I2c_Buf_Read中的数据通过串口打印for (i=0; i<256; i++){    printf("0xX ", I2c_Buf_Read[i]);         if(I2c_Buf_Read[i] != I2c_Buf_Write[i])          {             EEPROM_ERROR("0xX ", I2c_Buf_Read[i]);             EEPROM_ERROR("错误:I2C EEPROM写入与读出的数据不一致\n\r");             return 0;         }     }  EEPROM_INFO("I2C(AT24C02)读写测试成功\n\r");  return 1;  }5、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕! 查看全部

首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)

3、硬件:AT24C02 256KByte 

问题描述:Cubemx生成IIC代码会出现死机问题,或者压根运行不了!

问题原因:

1、ST为了规避飞利浦IIC专利问题,将STM32的硬件IIC设计的比较复杂,而且稳定性不怎么好,所以一般教程都不推荐使用。

2、Cubemx生成的代码有Bug!

解决办法:

1、设置

捕获.JPG

2、IIC的回调函数里面需要将时钟初始化放在引脚初始化之前

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(hi2c->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */

    __HAL_RCC_I2C1_CLK_ENABLE(); //默认生成的放在了引脚初始化后面!

  /* USER CODE END I2C1_MspInit 0 */

  

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */


  /* USER CODE BEGIN I2C1_MspInit 1 */


  /* USER CODE END I2C1_MspInit 1 */

  }


}

3、函数的具体应用需要结合AT24C02的数据手册,符合AT24C02的要求!

    

    我们在读写IIC时,即使不知道IIC的协议是什么,直接调用 HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) 这个函数就可以对IIC的设备进行读写,这就是Cubemx的优势!

    

    我先解释下这个函数里面的几个变量:


    I2C_HandleTypeDef *hi2c IIC的句柄

    uint16_t DevAddress IIC设备的外部地址

    uint16_t MemAddress IIC设备的内部地址

    uint16_t MemAddSize 读写内部地址的方式,一般使用I2C_MEMADD_SIZE_8BIT方式

                        注意只有两种选择:I2C_MEMADD_SIZE_8BIT 或者 I2C_MEMADD_SIZE_16BIT

    uint8_t *pData 写入的数组或者指针

    uint16_t Size 写入的字节数!

    注意:如果是AT24C02,这个字节数不能超过8!!!!!这也叫AT24C02的页写入!当然这是为了提高速度,如果你想不出错也不在乎速度,你可以将字节数设置为1,这样肯定不会出错!


捕获1.JPG    uint32_t Timeout 时间超时


4、程序实现

    注意:需要在写函数后面加入短延时!


uint8_t I2c_Buf_Write[256];

uint8_t I2c_Buf_Read[256];



uint8_t I2C_Test(void)

{

uint16_t i;

i2cStatus=HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000);  //0表示ready

printf("i2cStatus = %d\r\n ", i2cStatus);

i2cStatus1=HAL_I2C_GetState(&hi2c1);//32表示ready  HAL_I2C_STATE_READY  = 0x20U,   /*!< Peripheral Initialized and ready for use  */

printf("i2cStatus1 = %d\r\n ", i2cStatus1);

printf("写入的数据\n\r");


for ( i=0; i<256; i++ ) //填充缓冲

  {   

    I2c_Buf_Write[i] = i;

HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, i, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&(I2c_Buf_Write[i])), 1, 10000);//一个字节一个字节写,如果需要页写入(不超过8),使用40行的函数

// HAL_I2C_Mem_Write(&hi2c1, (uint16_t)EEPROM_Block0_ADDRESS, 0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t*)I2c_Buf_Write, 8, 10000);//不能超过8个字节,如果超过需要分开写,for循环里面改为i=i+8 

printf("0xX ", I2c_Buf_Write[i]);

HAL_Delay(5);//不能少

   }

  EEPROM_INFO("\n\r写成功\n\r"); 

HAL_Delay(500);

EEPROM_INFO("\n\r读出的数据\n\r");

  //将EEPROM读出数据顺序保持到I2c_Buf_Read中

//if(HAL_I2C_GetState(&hi2c1) == 0x20 ) //加入检测

if( HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 256, 1000) == HAL_OK)//另外一种检测方法

{

HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(EEPROM_Block0_ADDRESS+1 ),0x00, I2C_MEMADD_SIZE_8BIT,(uint8_t *)I2c_Buf_Read, 256, 10000); //读对字节数没有限制

}


//将I2c_Buf_Read中的数据通过串口打印

for (i=0; i<256; i++)

{

    printf("0xX ", I2c_Buf_Read[i]);

         if(I2c_Buf_Read[i] != I2c_Buf_Write[i])

          {

             EEPROM_ERROR("0xX ", I2c_Buf_Read[i]);

             EEPROM_ERROR("错误:I2C EEPROM写入与读出的数据不一致\n\r");

             return 0;

         } 

    }

  EEPROM_INFO("I2C(AT24C02)读写测试成功\n\r");

  return 1; 

 }


5、联系方式:微信Startingray,本人准备将cubemx的小bug解决的过程记录下来,也是给爱好者一点启示,欢迎微信和我沟通,共同进步!个人觉得Cubemx是未来的发展方向,可以使我们避免很多小错误,但是由于现在软件版本之间的兼容性,加上不同版本库之间存在的bug,还是需要我们在使用时时刻保持警惕!

一直Freertos以后 HAL_Delay 无法使用

寂寞,点燃一支烟 回复了问题 • 2 人关注 • 1 个回复 • 3744 次浏览 • 2017-11-30 14:32 • 来自相关话题

调试stm32F103C8t6的SPI1遇到的问题和解决途径

admin 回复了问题 • 2 人关注 • 3 个回复 • 5584 次浏览 • 2017-11-24 15:05 • 来自相关话题

探索者F4上写一些基于HAL的例程分享

____________________ 发表了文章 • 2 个评论 • 1782 次浏览 • 2017-09-15 21:19 • 来自相关话题

探索者F4_HAL库例程 001.LED.rar探索者F4_HAL库例程 002.LCD.rar探索者F4_HAL库例程 003.SDcard.rar探索者F4_HAL库例程 004.SDcard+FATFS.rar探索者F4_HAL库例程 006.Music Signal Spectrum ( 可以播放WAV等格式音乐的频谱).rar探索者F4_HAL库例程 007.LED Matrix (32x64) 08接口 32乘64点阵屏实现.rar 查看全部

记录:usb_hid的调试过程 (调试完毕)

一叶清风 回复了问题 • 31 人关注 • 20 个回复 • 23957 次浏览 • 2017-09-09 15:46 • 来自相关话题