下位机代码学习记录

下位机代码学习记录

学习记录

最近在做项目,接触下位机代码,在此记录学习过程,全文中有任何错误,欢迎指正,初学者,勿喷
采用芯片为国民技术N32G457 REL7

工程结构

正常下位机工程中的结构体系:
这部分是网上找的资料,叙述的是创建STM32工程,但与国民技术大同小异,国民技术给的例程中原有CMSIS->CMSIS+STARTUP,LIB->FWLB,USER->USER+BSP
N32国民技术工程结构
STM32国民技术工程结构
1.USERS文件
存放自己编辑的源文件和头文件。工程中包含自己的源文件,路径中包含头文件。另外,在USERS中,包含it.c and conf.h。
it中写中断函数,conf中释放自己需要的固件库头文件,屏蔽自己不需要的头文件。也就是说你在lib文件夹中包含了什么固件库,就需要在这里释放什么头文件。这和我们平时编写头文件和源文件的思路一样呀,一个头文件总是跟着一个源文件。

2.CMSIS文件
中存放工程都必须的启动代码,core_cm3.c / system_stm32f10x.c / startup_stm32f10x_hd.s (具体文件名需要根据自己的芯片判断)

3.LIB文件
中存放程序用到固件库的源程序,同时注意包含misc.c文件。
另外,不要忘了在C++选项卡中写入USE_STDPERIPH_DRIVER,写下这句话就意味着在stm32f10x.c中包含了conf.h头文件,(具体原理点这里)不然需要自己在文件中包含这个头文件,有点麻烦。

文件作用

1.core_cm3.c文件

在CoreSupport文件夹中有core_cm3.c和头文件core_cm3.h,它的作用是采用Cortex-M3内核设计的SoC芯片厂商设计的芯片提供了一个进入CM3内核的接口。core_cm3.c中还有一些与编译器(MDK、IAR等)有关的代码。较重要的是core_cm3.c中包含stdio.h头文件,这是一个ANSI C文件,主要作用是提供一些新类型的定义。

2.system_stm32f10x.c文件

DeviceSupport文件夹下是启动文件、外设寄存器定义、中断向量定义层的一些文件,这些文件由ST公司提供。system_stm32f10x.c的主要作用是设置系统时钟和总线时钟。

3.stm32f10x.h文件

这个文件非常重要,是非常底层的文件,包含了寄存器地址和结构体类型的定义,在使用到stm32固件库的地方都要包含它。

3.stm32f10x_it.c和stm32f10x_conf.h文件

stm32f10x_it.c这个文件主要是编写中断程序的,stm32f10x_conf.h被包含在stm32f10x.h文件中主要是配置外设的头文件,我们需要什么在这里打开。

4.startup_stm32f10x_hd.s文件
在这个文件中有一段启动文件,启动文件中先初始化系统时钟,然后才执行主函数,因此我们要注意配置时钟在这个文件里配置。基本上上面这些就能够完整的编译一个keil5的工程了。

5.关于misc.c文件
STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c.

BSP文件

挨个说说bsp文件中各个函数的作用

1.delay.c

  1. void systick_delay_us(u32 nus) 延时微秒
  2. void systick_delay_ms(u16 nms) 延时毫秒

具体步骤:

  • 选择系统时钟频率 :配置SysTick时钟源,SysTick时钟源,该参数可以是以下值之一:
    @arg SysTick_CLKSource_HCLK_Div8 AHB时钟除以8作为SysTick时钟源。
    @arg SysTick_CLKSource_HCLK选择AHB时钟作为SysTick时钟源。
  • 延时时间赋值
  • 清空计时器
  • 开始倒计时
  • 等待时间到达
  • 到达时间后:关闭计时,清空计数

2.clock.c

  1. void SetSysClockToHSI(void) 设置系统时钟为HSI

  2. void SetSysClockToHSE(void)
    选择HSE作为系统时钟源,配置HCLK、PCLK2和PCLK1预压器。 void SetSysClockToPLL(uint32_t freq, uint8_t src) 选择PLL锁相环作为系统时钟源
    此函数中包含错误处理机制,如果HSE启动失败,应用程序将出现错误时钟配置,用户可以在程序内部预留处添加一些代码来处理这个问题。

  3. void TIM1_Configuration(void)
    定时器配置
    设置预分频、装载值、计数值
    定时时间计算公式如下:
    定时时间计算
    TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频2 72M/(2+1)=24MHz
    TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535
    ((1+TIM_Prescaler )/72M)(1+TIM_Period )=((1+2)/72M)(1+65535)=0.00273秒=366.2Hz */

本项目中将TIM1设置为100us

  1. void Task_Tim(void)
    毫秒计数器
    设置一毫秒、十毫秒、五十毫秒计数标志位,根据时间来写主程序

3.sys.c

  1. NVIC_Configuration
    配置中断,注意主、副优先级范围;N32 457 主优先级0-1,副优先级0-7,
    配置串口优先级为0,3(主、从);定时器优先级为0,1;

  2. void IWDG_Configuration(void)

    配置看门狗时钟,让计数器重新加载值获得250ms IWDG TimeOut。
    Counter Reload Value = 250ms/IWDG计数器周期
    重载看门狗计数,使能看门狗;

  3. void GPIO_Configuration(void)
    配置GPIO,本工程中配置三个用于显示状态的LED IO口直接设置成推挽输出GPIO_Mode_Out_PP,IO口速率为50MHz,

4.uart.c

  1. void USART1_Config(void)
    串口配置:停止位、位数、引脚等配置;

  2. void Uart1SendOneByte(u8 data)
    检查UASRT标志是否设置,过USARTx外设传输单个数据,8bit,一个字节,FF。

  3. void Uart7SendOneWord(uint32_t value)
    利用Uart1SendOneByte传输四个字节,一个字,FF FF FF FF;

  4. uint8_t Make_Crc(uint8_t *data, uint8_t num)
    计算CRC校验码,叠加后加一,最后保留最后两位;

  5. void LoadImagDat(u16 seril,u8 cmd,u16 subseril,u8 *dat,u16 len)
    填充一帧DVP数据,并外发;
    seril ,subseril 编号、副编号;
    cmd 命令号;
    *dat 数据头指针;
    len 数据长度;
    具体要根据通讯协议组织数据结构;

  6. void SysInfoInit(void)
    帧头初始化,写入帧头、命令号、地址等固定的参数;

  7. void Task_Send(void)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值