外设初始化
GPIO初始化
复用初始化
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_03_GPIO1_IO19, /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B0_12_LPUART1_TX, /* GPIO_AD_B0_12 is configured as LPUART1_TX */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, /* GPIO_AD_B0_13 is configured as LPUART1_RX */
0U); /* Software Input On Field: Input Path is determined by functionality */
属性PAD初始化
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B1_03_GPIO1_IO19, /* GPIO_AD_B0_09 PAD functional properties : */
0x10B0u); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/6
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B0_12_LPUART1_TX, /* GPIO_AD_B0_12 PAD functional properties : */
0x10B0u); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/6
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B0_13_LPUART1_RX, /* GPIO_AD_B0_13 PAD functional properties : */
0x10B0u); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/6
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
模式初始化
/* Init output LED GPIO. */
GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);
SYSTICK函数
配置1ms定时周期
SysTick_Config(SystemCoreClock / 1000))
延时函数的实现
全局变量方式
/**
* @brief SysTick 中断服务函数
* @param 无 4 * @retval 无 5 * @attention
*/
void SysTick_Handler(void) 8 { 9 if (TimingDelay != 0x00)
{
TimingDelay--;
}
查询CTRL寄存器的方式
void SysTick_Delay_Us( __IO uint32_t us)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000000);//1us定时
for (i=0; i<us; i++)
{
/* 当计数器的值减小到 0 的时候,CRTL 寄存器的位 16 会置 1 */
while ( !((SysTick->CTRL)&(1<<16)) );
}
/* 关闭 SysTick 定时器 */
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
PIT定时器组
PIT定时器组有4个通道,或者说PIT拥有4个子定时器,这些子定时器共用一个时钟源,共用一个中断号。
通道的结构体定义如下:
typedef enum _pit_chnl
{
kPIT_Chnl_0 = 0U, /*!< PIT channel number 0*/
kPIT_Chnl_1, /*!< PIT channel number 1 */
kPIT_Chnl_2, /*!< PIT channel number 2 */
kPIT_Chnl_3, /*!< PIT channel number 3 */
} pit_chnl_t;
设置PIT时钟及分频
/*************************** 第一部分 ****************************/
/* 设置 PIT 定时器时钟 OSC_CLK*/
CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
/* 设置 PERCLK_CLK 时钟分频为 1 */
CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
修改PIT参数并初始化
/************************** 第二部分 ****************************/
/* 获得 PIT 定时器默认配置参数 */
PIT_GetDefaultConfig(&pitConfig);
/* 修改默认配置参数 */
pitConfig.enableRunInDebug = true;
/* 初始化 PIT */
PIT_Init(PIT, &pitConfig);
设置通道及重装值
/************************** 第三部分 ************************/
/* 设置 PIT 定时器通道 0 自动重装载值 */
PIT_SetTimerPeriod(PIT, PIT_CHANNEL_X, \
USEC_TO_COUNT(TIME_0, PIT_SOURCE_CLOCK));
配置中断并使能
/************************* 第四部分 **************************/
/* 清除通道 0 的中断标志位 */
PIT_ClearStatusFlags(PIT, PIT_CHANNEL_X, kPIT_TimerFlag);
/* 使能通道 0 的计时完成中断 */
PIT_EnableInterrupts(PIT, PIT_CHANNEL_X, kPIT_TimerInterruptEnable);
/* 设置中断优先级,*/
set_IRQn_Priority(PIT_IRQ_ID,Group4_PreemptPriority_6,Group4_SubPriority_0);
/* 使能 PIT 定时器中断 */
EnableIRQ(PIT_IRQ_ID);
SRAM初始化
FMC配置
上电序列初始化
标准库会直接将此部分写到配置函数里面,HAL库会增加一个函数SDRAM_Initialization_Sequence
外部RAM的使用
直接使用指针
适用于外扩RAM比较小的情况,需要配合宏定义使用,应用较为麻烦。
绝对定位方式
引入内存管理的概念,定义一个大数组当做内存池,再定义一个大数组当内存表,定义完这些变量后,再去写内存管理的应用程序。
应用时如下:
p = mymalloc ( sramx, 1024 * 2 ); //申请内存空间(实际获得一个指向内存池区域的指针)
sprintf((char*)p, "Memory Malloc"); //对申请的空间写值
自动分配
通过_MAIN函数前添加FMC初始化,并修改scatterr文件实现。
具体实现参照《零死角玩转 STM32—基于野火 F103(霸道_V2)开发板》
F427机架板的应用方式
应用中启动FMC,调用_init_alloc()分配堆空间,函数引用步骤如下:
- 包含头文件
#include <stdlib.h>
#include <rt_heap.h>
- 取消微库选项
总结
堆的意义在于后续使用malloc函数申请空间。
栈的意义在于局部变量的使用。
外部SRAM初始化
RT1052使用的外设为SEMC
STM32F4使用的是FMC,此外设从FSMC升级而来,增加了更多的功能支持。
安全外设
总线加密引擎(BEE)
支持QSPI的运行时解密,适用于固件加密与解密的应用。
数据协处理器(DCP)
支持AES-128、SHA-1、SHA256、CRC32计算。