一、概述
元器件东拼西凑总算焊接完了,接下打算写点程序测试一下硬件,为锻炼锻炼本事,打算学习使用CMSIS-RTX系统和它配套的中间件。先测试下点亮一个灯的程序,估计大部分学单片机的同仁都是从这个程序开始的吧。边学边做时间有点长,工程师要耐得住寂寞,扛得住折腾。折腾了这么久我的电源模拟部分还没试呢,估计有人都怀疑我是不是真的在做电源。我可以告诉你:做电源我是认真的。
二、程序工程创建
打开keil新建一个工程并保存,选择芯片的型号,我使用的是stm32f407zet6。点击确定后弹出Manage Run-Time Environment的对话框中选择要是用的系统RTX和驱动USART,顺便选择DSP和CORE,CMSIS DRIVER中把画箭头的组件都选择上,其中Etherne PHY选择lan8720。如下图1所示
图1
接下来选择Compiler组件和DEVICE组件,其中DEVICE组件中STM32Cube Framework(API)下选择Classic,如图2所示
图2
再接下来选择File System和Network中间件,文件系统就按图中所示选择,网络中间件中Sevice中选择FTP Server,Socket中选择TCP和UDP,如图3所示。
图3
如果Validation Output栏中有警告输出,点击Resolve按钮就会解决,如果不能解决双击警告就会跳到相应选项。
点击OK后就会跳到keil的工程编辑界面。在工程栏中找到Device展开,然后双击打开RTE_Device.h文件,在编辑栏下边点击Configuration Wizard后如下图4所示
图4
此处配置是配置单片机的对应管脚,其中USART、SPI1和SDIO按照原理图选择相应管脚即可,ETH选择RMII接口按照原理图选择相应管脚即可。
然后对中间件进行配置,其中网络中间件中我禁止了自动分配IP功能,输入了固定IP,如下图5所示。
图5
是不是觉得软件中每个选项是什么意思都不太明白,我是依据什么选的?那请看下图,按下图点击会打开CMSIS-RTX系统、文件中间件、网络中间件和驱动的帮助。如下图6所示
图6
以网络中间件为例,帮助文件如下图7所示。
图7
上图7中①是讲解怎样创建一个网络的应用,②是网络的例子,③是网络的参考函数。帮助文件都是英文的,为锻炼大家英语水平我就不挨个翻译了。呵呵。。。。其实我是回小学深造后看懂的这个帮助文件,我请了一个在小学教数学的家教——我媳妇。文档中哪里有错误大家不要笑话我,因为我可以很骄傲的告诉大家我的英语是数学老师教的。哈哈。。。。
接下来该添加主程序文件和其他应用程序文件了,主程序文件我们使用keil自带的模板就行,添加方式如下图8所示。
图8
添加完主程序、应用程序和板级支持包文件夹后工程结构如下图9所示。
图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所示。
图10
其中PHY_LAN8720.c文件需要屏蔽150—163行,因为我发现运行到150行就报错,读取phy的地址错误,目前还不知什么原因所以就屏蔽掉了。还需要添加 ETH_PHY_ADDR=0。如下图11所示。
图11
编译一下,下载进去,用ftp软件连接试试,能正常操作说明网口和SD卡电路是正常的,之后用串口助手看看,串口也是正常的,LED灯也正常。先调试这点吧。慢慢学习,学海无涯,回头是岸。有位电子界的大师有句名言:技术愉悦人生。一片篇文章不能全部记录详细开发过程,不过记录我怎样开始学习cmsis,怎么查看cmsis帮助。
原创作品,未经权利人授权禁止转载。详情见转载须知。 举报文章
我要举报该内容理由
×