hehung

  • 2023-06-02
  • 回复了主题帖: 【极海APM32F407】 3. 极简方式集成FreeRTOS

    nmg 发表于 2023-6-2 16:46 看起来好轻松的样子
    是的,用KEIL自带的CMSIS-FreeRTOS包,集成起来很简单。感谢管理员大佬支持

  • 回复了主题帖: 祝大家六一快乐!EEWorld喊你用芯积分兑换六一专属礼品啦!

    可以可以,刚好够兑换一个怀旧大礼包

  • 发表了主题帖: 【极海APM32F407】 3. 极简方式集成FreeRTOS

    本帖最后由 hehung 于 2023-6-2 11:28 编辑 [【极海APM32F407】 1. 开箱啦](http://bbs.eeworld.com.cn/thread-1244122-1-1.html) [【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向](http://bbs.eeworld.com.cn/thread-1244768-1-1.html) # 前言 FreeRTOS作为一款开源的嵌入式实时操作系统,广泛的运用在嵌入式行业,在芯片中集成嵌入式系统也是很有必要的一件事,可以方便的处理各个任务之间的关系,进行精确地时间控制等。本文将讲解如何在APM32F407中集成FreeRTOS OS。 开发环境: - 系统:win10 - IDE:KEIL V5.34 - 单片机:APM32F407 - freeRTOS:KEIL集成包CMSIS-FreeRTOS V10.5.1 # 1 准备工作 ## 1.1 下载FreeRTOS KEIL中是集成了FreeRTOS系统的,可以直接在 `Pack Installer`中安装,如下图,点击 `Install`即可。这样就不用去freeRTOS官网下载整个freeRTOS包了。简单方便快捷。 ![](https://pic.imgdb.cn/item/64794027f024cca173078a55.png) 下载过程中可能出现超时的问题,导致下载不成功,因为keil官网从国内访问不是很稳定。 ![](https://pic.imgdb.cn/item/64794027f024cca173078a83.png) 出现上述情况,可以直接在keil官网去下载,使用迅雷要快很多,下载好了之后直接双击pack包安装即可。 官方地址:[http://www.keil.com/pack/](http://www.keil.com/pack/) ![](https://pic.imgdb.cn/item/64794027f024cca173078a6b.png) ## 1.2 集成freeRTOS到工程 1. 下载好freeRTOS的CMSIS-pack包之后,双击安装即可。 2. 安装完成之后,随便选择一个官方示例工程,接着下一步 3. 打开工程,选择 `Manage Run-Time Environment`,选择 `RTOS`,配置相关信息,见下图: ![](https://pic.imgdb.cn/item/64794028f024cca173078a9c.png) > 不要管上图中出现的警告消息,提示的是没有内核启动代码,我们工程中是有的,不用管 4. 编译,出现下面的错误,原因是KEIL自动添加的FreeRTOSConfig.h将 `configUSE_TIMERS`设置为了0,修改为1即可。 ![](https://pic.imgdb.cn/item/64794028f024cca173078ab4.png) 5. 再次编译,出现了下面的错误,提示下属三个函数重定义了,因为FreeRTOS实现了这三个函数,所以我们需要将工程中默认提供的这三个函数删除掉,这三个函数在文件 `apm32f4xx_int.c`中。 ![](https://pic.imgdb.cn/item/6479406ff024cca17307b852.png) 6. 再次编译,OK了,接下面就是写一个写两个任务看看能不能跑起来了。 # 2 代码实现 下面实现了两个任务:led1_task和led2_task,分别驱动LED2和LED3闪烁,led1_task的工作周期为500ms,led2_task的工作周期为1000ms。 因为freeRTOS用到了systick,所以需要初始化,实现函数 `SysTick_Init();`。 ```c /* @hehung 2023-5-22 email: 1398660197@qq.com wechat: hehung95 reproduced and please indicate the source @hehung */ #include "main.h" #include "Board.h" #include "app_uart.h" /* FreeRTOS includes. */ #include "FreeRTOS.h" #include "task.h" #define LED1_TASK_PRIO                3                //任务优先级 #define LED1_STK_SIZE                 50          //任务堆栈大小 TaskHandle_t LED1Task_Handler;                //任务句柄 void led1_task(void *pvParameters);        //任务函数 #define LED2_TASK_PRIO                3                //任务优先级 #define LED2_STK_SIZE                 50          //任务堆栈大小 TaskHandle_t LED2Task_Handler;                //任务句柄 void led2_task(void *pvParameters);        //任务函数 void SysTick_Init(void); /*! * @brief       Main program * * @param       None * * @retval      None */ int main(void) {     APM_TINY_LEDInit(LED2);     APM_TINY_LEDInit(LED3);     USART_Init();         printf ("APM32F407 freeRTOS test\r\n");             /** SysTick Initialization */     SysTick_Init();                         //创建led1任务     xTaskCreate((TaskFunction_t )led1_task,            //任务函数                 (const char*    )"led1_task",          //任务名称                 (uint16_t       )LED1_STK_SIZE,        //任务堆栈大小                 (void*          )NULL,                  //传递给任务函数的参数                 (UBaseType_t    )LED1_TASK_PRIO,       //任务优先级                 (TaskHandle_t*  )&LED1Task_Handler);   //任务句柄                                   //创建led1任务     xTaskCreate((TaskFunction_t )led2_task,            //任务函数                 (const char*    )"led2_task",          //任务名称                 (uint16_t       )LED2_STK_SIZE,        //任务堆栈大小                 (void*          )NULL,                  //传递给任务函数的参数                 (UBaseType_t    )LED2_TASK_PRIO,       //任务优先级                 (TaskHandle_t*  )&LED2Task_Handler);   //任务句柄                   vTaskStartScheduler();          //开启任务调度     while(1)     {     } } void led1_task(void *pvParameters) {         while(1)         {                 APM_TINY_LEDToggle(LED2);                 vTaskDelay(500);         } } void led2_task(void *pvParameters) {         while(1)         {                 APM_TINY_LEDToggle(LED3);                 vTaskDelay(1000);         } } void SysTick_Init(void) {     /** SystemFrequency / 1000 = 1ms */     if (SysTick_Config(SystemCoreClock / 1000))     {         /** Capture error */         while (1);     } } ``` # 3 实验效果 如下图所示,LED2闪烁两次,LED1才会闪烁一次,实验成功。 ![](https://pic.imgdb.cn/item/6479408bf024cca17307ca61.gif)

  • 回复了主题帖: 【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向

    lugl4313820 发表于 2023-6-1 08:57 何老师的scanf的教程非常好,在评测帖里,很少看到的scanf的例子,非常感谢分享!
    感谢大佬捧场

  • 2023-05-29
  • 回复了主题帖: 【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向

    wangerxian 发表于 2023-5-29 10:03 打印浮点型怎么样?
    没问题的,亲测浮点数打印正确

  • 2023-05-28
  • 回复了主题帖: 【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向

    caizhiwei 发表于 2023-5-28 08:02 Keil倒是简单,中规中矩,fputc 即可。 但是你用IAR9.30的时候,你会发现,又翻车了!
    IAR没试过,后边有机会试一下

  • 2023-05-26
  • 发表了主题帖: 【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向

    # 前言 printf和scanf是学习C语言是首先会接触的内容。在单片机上也可以使用这两个函数实现打印功能,需要结合串口实现,也需要IDE支持,不同的IDE实现scanf接收和printf打印的方法是不一样的。本文将讲解如何使用KEIL实现printf和scanf。 本文试验的测试环境: - 系统:win10 - IDE:KEIL V5.34 - 单片机:极海APM407IGT6 # 1 硬件连接 首先是确定串口连接,下载APM407的数据手册,可以看到USART1连接到了PA9(TX)和PA10(RX)上,正好官方提供的例程也是使用的USART1,所以将官方例程直接拿过来修改完成我们需要的功能即可。 连接线路如下: | USB-TTL | APM32F407 | | ------- | --------- | | RX      | PA9       | | TX      | PA10      | | GND     | GND       | > 注:官方例程是基于MINI开发板的,我们这块是TINY开发板,所以使用的库是不一样的,需要修改,后面讲述方法。 # 2 软件代码编写 要实现printf和scanf,本质上是实现fputc和fgetc函数。 需要实现对单个字符的接收和发送即可。实现代码如下: ```c // fputs for printf or other print function in standard int fputc(int ch, FILE *f) {         (void)f;         /** Wait until end of transmission */         USART_TxData(TINY_COM1, (uint8_t)ch);         while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_TXBE) == RESET) {};     return ch; } // fgets for scanf or other input function in standard int fgetc(FILE *f) {         uint8_t ch;         (void)f;         while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_RXBNE) == RESET) {};         ch = USART_RxData(TINY_COM1);         return (int)ch; } ``` 主函数实现如下: 功能: - 初始化LED2和LED3,上电时为熄灭状态 - 初始化串口USART1,波特率为115200 - 打印信息到串口,然后从串口接收一个整数并通过串口打印出来 - 完成之后LED2和LED3亮 ```c int main(void) {     APM_TINY_LEDInit(LED2);     APM_TINY_LEDInit(LED3);     USART_Init();         printf ("APM32F407 printf test\r\n");         printf ("Please input a number with int type\r\n");         int a;         scanf ("%d", &a);         printf ("The number you input is: %d", a);         APM_TINY_LEDOn(LED2);         APM_TINY_LEDOn(LED3);     while(1)     {     } } ``` # 3 注意事项 ## 3.1 勾选 Use MicroLIB 如果需要成功使用 `printf`和 `scanf`功能,需要勾选 `Use MicroLIB`使用KEIL的内置库,不然使用printf和scanf的时候会导致程序卡死。 ## 3.2 修改编译器宏 官方提供的Demo程序使用的是MINI板子的代码,我们的板子是TINY板子,所以需要修改KEIL编译器宏为 `APM32F407_TINY`,用来定位到TINY板子所包含的头文件。 > 注:代码中关于MINI的部分都修改为TINY即可。 # 4 实现效果 如下,测试成功,后续就可以使用printf来打印以及使用scanf来接收命令了。

  • 2023-05-25
  • 回复了主题帖: 【极海APM32F407】 1. 开箱啦

    damiaa 发表于 2023-5-23 21:59 楼主加油
    感谢支持

  • 回复了主题帖: 【极海APM32F407】 1. 开箱啦

    lugl4313820 发表于 2023-5-23 16:40 何总,大佬,你还有闲来无事,太谦虚了吧!

  • 2023-05-23
  • 回复了主题帖: 【极海APM32F407】 1. 开箱啦

    lugl4313820 发表于 2023-5-23 07:33 大佬 参与这个评测看来精彩作品就要来了!
    过奖了,最近闲来无事,申请下来玩玩

  • 2023-05-22
  • 加入了学习《极海APM32F407技术微课堂》,观看 APM32F407 USB2.0通信应用讲解

  • 回复了主题帖: 【极海APM32F407】 1. 开箱啦

    caizhiwei 发表于 2023-5-22 18:48 楼主加油~~
    感谢支持

  • 回复了主题帖: 兆易一下发布3款M7的MCU,GD32H737/757/759系列

    整起来

  • 发表了日志: 【极海APM32F407】 1. 开箱啦

  • 发表了主题帖: 【极海APM32F407】 1. 开箱啦

    开箱   周一上班就收到了快递,趁着午休的时候赶紧拆开来看看,APM32F407被一个气泡袋包着,并且放在一个透明的盒子中,很好的解决了快递过程中防撞的问题。这个好评。     包装盒里面还有一个卡片,背面介绍了APM32F407的特点,板载资源,上手说明,支持OS,支持工具链等相关内容。通过查看这个卡片,就可以大致了解APM32F407这款单片机,并且让初次接触这款单片机的小伙伴知道从哪里入手。好评+1。     打开盒子是单片机APM32F407,板子不算小巧,可以是需要引出所有引脚的原因,板载算是比较大的。   可以看到上半部分是一块板载调试器,不用外接调试设备。这对用户及其友好,剩下了购买调试器的钱,哈哈。好评+1。   而且就算后边不想用板载调试器,也可以通过跳线以及板载扩展引脚连接自己的调试器。好评+1。   板子下半部分是核心板以及引出引脚(共134个)。所有引脚均做了引出,方便扩展。好评+1。   还提供了arduino引脚扩展。好评+1。   其他板载外设资源包括了:   2个按键   2个LED     板子背面什么也没有。     总结   极海APM32F407开发板整体为黑色,显得高大上,引出了所有外设,方便扩展,是比较符合我期望的一款板子,板载资源也比较丰富,主频高达168MHz,可以满足绝大部分单片机应用场景了。后期就开始学习搭建环境学习起来了。  

  • 2023-05-19
  • 回复了主题帖: 测评入围名单:极海APM32F407 Tiny Board

    个人信息无误,确认可以完成评测计划

  • 回复了主题帖: 【GD32L233C-START评测】14. CAU加密算法之AES

    fffqw123 发表于 2023-5-19 01:52 有函数cau_aes_ecb源码吗?
    cau_aes_ecb是官方库文件提供的

  • 2023-03-08
  • 回复了主题帖: 3月7日,ST推出新品基于M33内核的STM32H5,你感兴趣吗?

    1

  • 2023-02-15
  • 回复了主题帖: (已全部安排派发)颁奖:寻找身边8位单片机,抢楼赢ST最新M0开发板活动

    恭喜各位大佬

  • 2023-02-13
  • 回复了主题帖: 【开工大吉,抢楼有礼】聊一聊你感兴趣的技术和板子

    推荐测试一些国产板子

最近访客

< 1/6 >

统计信息

已有145人来访过

  • 芯积分:81
  • 好友:--
  • 主题:79
  • 回复:122
  • 课时:2
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


myk523 2021-6-15
这个的例程还有吗,麻烦指导一下834410355@qq.com
查看全部