硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6211|回复: 32
收起左侧

[客户分享] ARM CMSIS Driver 学习 之 USART

  [复制链接]

19

主题

15

回帖

72

积分

初级会员

积分
72
发表于 2018-4-6 20:18:44 | 显示全部楼层 |阅读模式
本帖最后由 XinLiArmfly 于 2018-4-6 21:22 编辑

ARM CMSIS Driver 学习 之 USART

       最近把 MDK 升级到了 V5.25 ,发现 Managing Run-Time Environment 中已经有好多好多的库。相比之前已经好了太多太多,从底层驱动,到上层协议栈,常用的有不常用的也有。发现 ARM 对这套系统的更新速度加快了一些,觉得有必要学习一下。从驱动开始学起,先学 USART API 详细介绍见 CMSIS Driver USART API

USART 把收到的数据再发出去程序
  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  XinLi
  5.   * @version v1.0
  6.   * @date    20-March-2018
  7.   * @brief   Main program body.
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * <h2><center>Copyright &#169; 2018 XinLi</center></h2>
  12.   *
  13.   * This program is free software: you can redistribute it and/or modify
  14.   * it under the terms of the GNU General Public License as published by
  15.   * the Free Software Foundation, either version 3 of the License, or
  16.   * (at your option) any later version.
  17.   *
  18.   * This program is distributed in the hope that it will be useful,
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.   * GNU General Public License for more details.
  22.   *
  23.   * You should have received a copy of the GNU General Public License
  24.   * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  25.   *
  26.   ******************************************************************************
  27.   */

  28. /* Header includes -----------------------------------------------------------*/
  29. #include "stm32f4xx.h"
  30. #include "Driver_USART.h"
  31. #include <string.h>

  32. /* Macro definitions ---------------------------------------------------------*/
  33. /* Type definitions ----------------------------------------------------------*/
  34. /* Variable declarations -----------------------------------------------------*/
  35. extern ARM_DRIVER_USART Driver_USART1;

  36. /* Variable definitions ------------------------------------------------------*/
  37. static uint8_t rxBuffer[1024] = {0};
  38. static uint8_t txBuffer[1024] = {0};

  39. /* Function declarations -----------------------------------------------------*/
  40. static void USART1_Callback(uint32_t event);
  41. static void SystemClock_Config(void);

  42. /* Function definitions ------------------------------------------------------*/

  43. /**
  44.   * @brief  Main program.
  45.   * @param  None.
  46.   * @return None.
  47.   */
  48. int main(void)
  49. {
  50.   /* STM32F4xx HAL library initialization:
  51.        - Configure the Flash prefetch, instruction and Data caches
  52.        - Configure the Systick to generate an interrupt each 1 msec
  53.        - Set NVIC Group Priority to 4
  54.        - Global MSP (MCU Support Package) initialization
  55.      */
  56.   HAL_Init();
  57.   
  58.   /* Configure the system clock to 168 MHz */
  59.   SystemClock_Config();
  60.   
  61.   Driver_USART1.Initialize(USART1_Callback);
  62.   Driver_USART1.PowerControl(ARM_POWER_FULL);
  63.   Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |
  64.                         ARM_USART_DATA_BITS_8 |
  65.                         ARM_USART_PARITY_NONE |
  66.                         ARM_USART_STOP_BITS_1 |
  67.                         ARM_USART_FLOW_CONTROL_NONE, 115200);
  68.   Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
  69.   Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);
  70.   
  71.   Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
  72.   
  73.   for(;;)
  74.   {
  75.    
  76.   }
  77. }

  78. /**
  79.   * @brief  USART1 callback function.
  80.   * @param  event: USART events notification mask.
  81.   * @return None.
  82.   */
  83. static void USART1_Callback(uint32_t event)
  84. {
  85.   if(event & ARM_USART_EVENT_RX_TIMEOUT)
  86.   {
  87.     Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);
  88.    
  89.     uint32_t length = Driver_USART1.GetRxCount();
  90.    
  91.     memcpy(txBuffer, rxBuffer, length);
  92.    
  93.     Driver_USART1.Send(txBuffer, length);
  94.     Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
  95.   }
  96. }

  97. /**
  98.   * @brief  System Clock Configuration
  99.   *         The system Clock is configured as follow :
  100.   *            System Clock source            = PLL (HSE)
  101.   *            SYSCLK(Hz)                     = 168000000
  102.   *            HCLK(Hz)                       = 168000000
  103.   *            AHB Prescaler                  = 1
  104.   *            APB1 Prescaler                 = 4
  105.   *            APB2 Prescaler                 = 2
  106.   *            HSE Frequency(Hz)              = 8000000
  107.   *            PLL_M                          = 8
  108.   *            PLL_N                          = 336
  109.   *            PLL_P                          = 2
  110.   *            PLL_Q                          = 7
  111.   *            VDD(V)                         = 3.3
  112.   *            Main regulator output voltage  = Scale1 mode
  113.   *            Flash Latency(WS)              = 5
  114.   * @param  None
  115.   * @retval None
  116.   */
  117. static void SystemClock_Config(void)
  118. {
  119.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  120.   RCC_OscInitTypeDef RCC_OscInitStruct;

  121.   /* Enable Power Control clock */
  122.   __HAL_RCC_PWR_CLK_ENABLE();

  123.   /* The voltage scaling allows optimizing the power consumption when the device is
  124.      clocked below the maximum system frequency, to update the voltage scaling value
  125.      regarding system frequency refer to product datasheet.  */
  126.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  127.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  128.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  129.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  130.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  131.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  132.   RCC_OscInitStruct.PLL.PLLM = 8;
  133.   RCC_OscInitStruct.PLL.PLLN = 336;
  134.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  135.   RCC_OscInitStruct.PLL.PLLQ = 7;
  136.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
  137.   
  138.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  139.      clocks dividers */
  140.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  141.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  142.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  143.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  144.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
  145.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

  146.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */
  147.   if (HAL_GetREVID() == 0x1001)
  148.   {
  149.     /* Enable the Flash prefetch */
  150.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
  151.   }
  152. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2018-4-6 20:25:45 | 显示全部楼层
谢谢楼主分享。

开头有个小错误,最近把 MDK 升级到了 V2.25  --- 5.25   
回复

使用道具 举报

19

主题

15

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-4-6 21:22:01 | 显示全部楼层
eric2013 发表于 2018-4-6 20:25
谢谢楼主分享。

开头有个小错误,最近把 MDK 升级到了 V2.25  --- 5.25

谢谢指出
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 11:28:51 | 显示全部楼层

int main(void)
{
//        UART1_Comm_Init(115200);
        UART2_Comm_Init(9600);
      
        Driver_USART2.Send("http://www.cmsoft.cn", sizeof("http://www.cmsoft.cn"));
        while(1);
}
程序运行到Driver_USART2.Send就卡在这一行 无法运行到while那里   同时发送的内容也没发出去
不知道咋回事????
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 11:29:15 | 显示全部楼层

void USART2_Callback(uint32_t event)
{
  if(event & ARM_USART_EVENT_RX_TIMEOUT)
  {
    Driver_USART2.Control(ARM_USART_ABORT_RECEIVE, 1);
   
    uint32_t length = Driver_USART2.GetRxCount();
   
//    memcpy(txBuffer, rxBuffer, length);
//   
//    Driver_USART1.Send(txBuffer, length);
    Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
  }      
        else if(event & ARM_USART_EVENT_SEND_COMPLETE)
        {
                __NOP();
        }
        else if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
        {
                __NOP();
        }
}
从电脑端的串口工具发送内容  也没产生串口回调事件   不知道咋回事?????
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 11:29:36 | 显示全部楼层

void UART2_Comm_Init(uint32_t Brate)
{//usb

        Driver_USART2.Initialize(USART2_Callback);
        Driver_USART2.PowerControl(ARM_POWER_FULL);
        Driver_USART2.Control(ARM_USART_MODE_ASYNCHRONOUS |
                                                                                ARM_USART_DATA_BITS_8 |
                          ARM_USART_PARITY_NONE |
                          ARM_USART_STOP_BITS_1 |
                          ARM_USART_FLOW_CONTROL_NONE, Brate
                         );
        /* Enable Receiver and Transmitter lines */
        Driver_USART2.Control(ARM_USART_CONTROL_TX, 1);
        Driver_USART2.Control(ARM_USART_CONTROL_RX, 1);
        /* Begin to receive */
        Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
}
这是串口初始化
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-17 11:31:20 | 显示全部楼层
wlx18682353162 发表于 2020-9-17 11:28
int main(void)
{
//        UART1_Comm_Init(115200);

直接用做好的例子测试下

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
http://www.armbbs.cn/forum.php?m ... 3714&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 14:39:50 | 显示全部楼层
对  就是看好这点  3Q
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 16:16:35 | 显示全部楼层
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 16:17:02 | 显示全部楼层
int main (void)
{       
        /* HAL&#191;a£&#172;MPU£&#172;Cache£&#172;ê±&#214;óμè&#207;μí33&#245;ê&#188;&#187;ˉ */
        System_Init();

        /* &#196;úo&#203;&#191;a&#198;&#244;&#199;°1&#216;±&#213;HALμ&#196;ê±&#188;&#228;&#187;ù×&#188; */
        HAL_SuspendTick();
       
        /* &#196;úo&#203;3&#245;ê&#188;&#187;ˉ */
        osKernelInitialize();                                 

        /* ′′&#189;¨&#198;&#244;&#182;ˉè&#206;&#206;&#241; */
        ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  

        /* &#191;a&#198;&#244;&#182;àè&#206;&#206;&#241; */
        osKernelStart();
       
        while(1);
}
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-17 16:18:30 | 显示全部楼层
根据你提供的例子  发现启动文件里面有进行SystemInit初始化   但是你main里面又进行了System_Init   
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-18 02:31:03 | 显示全部楼层
wlx18682353162 发表于 2020-9-17 16:18
根据你提供的例子  发现启动文件里面有进行SystemInit初始化   但是你main里面又进行了System_Init

SystemInit和System_Init  是两个不同的函数
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-26 13:55:57 | 显示全部楼层
硬汉哥   SMT32F107的ARM CMSIS Driver 学习 之 USART  硬是发不了数据    程序全速运行直接卡在发送函数了    实在是纳闷   希望能得到硬汉哥的帮助  我在前面发言过 程序基本情况前面已经贴出来了   到底是哪里出了问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-26 14:39:37 | 显示全部楼层
wlx18682353162 发表于 2020-9-26 13:55
硬汉哥   SMT32F107的ARM CMSIS Driver 学习 之 USART  硬是发不了数据    程序全速运行直接卡在发送函数了 ...

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
http://www.armbbs.cn/forum.php?m ... 3714&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-26 15:09:02 | 显示全部楼层
SystemInit和System_Init  是两个不同的函数
------------------------------------------------------------
关于以上两个函数  一个是启动文件里的  一个是main函数开始配置的   
SystemClock_Config()对于这个的配置主要是针对HAL库的吧   
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-26 15:20:30 | 显示全部楼层
你发的这个例程我看了  我现在测试的是F107 不是F407    我想说的是  有没有没做对的地方???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-27 10:00:58 | 显示全部楼层
wlx18682353162 发表于 2020-9-26 15:20
你发的这个例程我看了  我现在测试的是F107 不是F407    我想说的是  有没有没做对的地方???

107也没问题的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-27 10:01:15 | 显示全部楼层
wlx18682353162 发表于 2020-9-26 15:09
SystemInit和System_Init  是两个不同的函数
--------------------------------------------------------- ...

对的,没问题。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-28 17:42:57 | 显示全部楼层
按理107比407更简单  也不存在407的System_Init这个初始化啊
现在就是这儿卡壳了  全网说到这个的很少
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-28 17:51:08 | 显示全部楼层
实在是不得已  才来麻烦一下硬汉哥啊  希望能得到你的帮助
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-28 17:56:58 | 显示全部楼层
发表这个例子的上面那哥们儿 好像好久也没在论坛出现了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-9-29 04:55:57 | 显示全部楼层
wlx18682353162 发表于 2020-9-28 17:42
按理107比407更简单  也不存在407的System_Init这个初始化啊
现在就是这儿卡壳了  全网说到这个的很少

跟这个没关系啊,System_Init是我自己整理的一个函数,仅仅是方便在OS下:
OS启动前初始化系统时钟什么的,启动后,BSP初始化。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-12-31 16:23:53 | 显示全部楼层
请问硬汉   咱们这论坛怎么贴图片出来 ??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2021-1-1 10:31:19 | 显示全部楼层
wlx18682353162 发表于 2020-12-31 16:23
请问硬汉   咱们这论坛怎么贴图片出来 ??

QQ截图20210101103052.png
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-4 15:09:42 | 显示全部楼层
QQ截图20210104112306.bmp
这个网络模块的编译错误 排查了好久  没解决  请问硬汉?咋回事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2021-1-5 08:15:50 | 显示全部楼层
wlx18682353162 发表于 2021-1-4 15:09
这个网络模块的编译错误 排查了好久  没解决  请问硬汉?咋回事

你用的什么,F107?
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-5 08:58:52 | 显示全部楼层
是的 107   这个问题该怎么解决呢?、硬汉  
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-5 11:48:29 | 显示全部楼层
展开工程列表
QQ截图20210105075556.bmp
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2021-1-6 08:49:09 | 显示全部楼层
wlx18682353162 发表于 2021-1-5 08:58
是的 107   这个问题该怎么解决呢?、硬汉

107好久不用了,回头我帮你测测。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-6 08:52:27 | 显示全部楼层
非常感谢硬汉   107和407  107还是很具性价比的
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-11 14:10:26 | 显示全部楼层
硬汉 最近有测试107吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2021-1-12 08:48:47 | 显示全部楼层
wlx18682353162 发表于 2021-1-11 14:10
硬汉 最近有测试107吗?

还没有,手头没有107版,等后面测试了告诉你。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2021-1-13 09:33:45 | 显示全部楼层

非常谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 19:50 , Processed in 0.276613 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表