一个电源的“出生”过程(5)

CMSIS RTX 单片机
work11
发布时间: 2018-10-23
阅读: 1442


一、概述

元器件东拼西凑总算焊接完了,接下打算写点程序测试一下硬件,为锻炼锻炼本事,打算学习使用CMSIS-RTX系统和它配套的中间件。先测试下点亮一个灯的程序,估计大部分学单片机的同仁都是从这个程序开始的吧。边学边做时间有点长,工程师要耐得住寂寞,扛得住折腾。折腾了这么久我的电源模拟部分还没试呢,估计有人都怀疑我是不是真的在做电源。我可以告诉你:做电源我是认真的。

二、程序工程创建

打开keil新建一个工程并保存,选择芯片的型号,我使用的是stm32f407zet6。点击确定后弹出Manage Run-Time Environment的对话框中选择要是用的系统RTX和驱动USART,顺便选择DSPCORECMSIS DRIVER中把画箭头的组件都选择上,其中Etherne PHY选择lan8720。如下图1所示

1cmsis.PNG

1

接下来选择Compiler组件和DEVICE组件,其中DEVICE组件中STM32Cube Framework(API)下选择Classic,如图2所示

2dver.PNG

2

再接下来选择File SystemNetwork中间件,文件系统就按图中所示选择,网络中间件中Sevice中选择FTP ServerSocket中选择TCPUDP,如图3所示。

mid.PNG

3

如果Validation Output栏中有警告输出,点击Resolve按钮就会解决,如果不能解决双击警告就会跳到相应选项。

点击OK后就会跳到keil的工程编辑界面。在工程栏中找到Device展开,然后双击打开RTE_Device.h文件,在编辑栏下边点击Configuration Wizard后如下图4所示

RTE.PNG

4

此处配置是配置单片机的对应管脚,其中USARTSPI1SDIO按照原理图选择相应管脚即可,ETH选择RMII接口按照原理图选择相应管脚即可。

然后对中间件进行配置,其中网络中间件中我禁止了自动分配IP功能,输入了固定IP,如下图5所示。

net.PNG

5

  是不是觉得软件中每个选项是什么意思都不太明白,我是依据什么选的?那请看下图,按下图点击会打开CMSIS-RTX系统、文件中间件、网络中间件和驱动的帮助。如下图6所示

11help.PNG

6

以网络中间件为例,帮助文件如下图7所示。

nethelp.PNG

                                                                                                         图7

上图7中①是讲解怎样创建一个网络的应用,②是网络的例子,③是网络的参考函数。帮助文件都是英文的,为锻炼大家英语水平我就不挨个翻译了。呵呵。。。。其实我是回小学深造后看懂的这个帮助文件,我请了一个在小学教数学的家教——我媳妇。文档中哪里有错误大家不要笑话我,因为我可以很骄傲的告诉大家我的英语是数学老师教的。哈哈。。。。

接下来该添加主程序文件和其他应用程序文件了,主程序文件我们使用keil自带的模板就行,添加方式如下图8所示。

4addfile.PNG

8

添加完主程序、应用程序和板级支持包文件夹后工程结构如下图9所示。

3project.PNG

9

其中main.c文件的程序代码如下:

 

#include "main.h"

 

osThreadDef (thrLED, osPriorityNormal, 1, 0);

osThreadDef (thrUART, osPriorityNormal, 1, 0);

osThreadDef (thrfile, osPriorityNormal, 1, 0);

osThreadDef (thrNET, osPriorityNormal, 1, 0);

osThreadDef (thrSPI, osPriorityNormal, 1, 0);

void _Error_Handler(char *file, int line)

{ 

  while(1)

  {

  } 

}

 

void SystemClock_Config(void)

{ 

  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;   

  __HAL_RCC_PWR_CLK_ENABLE(); 

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);   

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.LSEState = RCC_LSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 25;

  RCC_OscInitStruct.PLL.PLLN = 336;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

  RCC_OscInitStruct.PLL.PLLQ = 7;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

 

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;

  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  } 

   

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

   

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

 

  HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);

} 

int main (void)

{

         HAL_Init();

         SystemClock_Config();

         SystemCoreClockUpdate();

        

  osKernelInitialize ();                    // initialize CMSIS-RTOS

  // initialize peripherals here

         LED_Initialize();

         myUSART_init(); 

         netInitialize ();

  // create 'thread' functions that start executing,

  // example: tid_name = osThreadCreate (osThread(name), NULL);

         tid_thrLED=osThreadCreate (osThread (thrLED), NULL);

         tid_myUART=osThreadCreate (osThread (thrUART), NULL);         

         tid_thrfile=osThreadCreate (osThread (thrfile), NULL);

         tid_thrNET=osThreadCreate (osThread (thrNET), NULL);

         tid_mySPI=osThreadCreate (osThread (thrSPI), NULL);

  osKernelStart ();                         // start thread execution

}

 

其他应用文件的代码就不在这里展示了,有时间上传到百度云盘大家帮忙完善完善找找bug。工程中RTX系统配置如下图10所示。

cmsisconfg.PNG

10

其中PHY_LAN8720.c文件需要屏蔽150—163行,因为我发现运行到150行就报错,读取phy的地址错误,目前还不知什么原因所以就屏蔽掉了。还需要添加 ETH_PHY_ADDR=0。如下图11所示。

lan8720.PNG

                                                                                                         11

编译一下,下载进去,用ftp软件连接试试,能正常操作说明网口和SD卡电路是正常的,之后用串口助手看看,串口也是正常的,LED灯也正常。先调试这点吧。慢慢学习,学海无涯,回头是岸。有位电子界的大师有句名言:技术愉悦人生。一片篇文章不能全部记录详细开发过程,不过记录我怎样开始学习cmsis,怎么查看cmsis帮助。


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (1)
work11
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)