资讯动态

ARM单片机编程几步走

发布时间:2026/10/20 1:27:11 来源:尧图企业网站定制
基础准备1.1 寄存器位编程在寄存器文件中我们常见到_Pos、_Msk变量Pos(位偏移)指定在寄存器中的起始位置以位为单位Msk(位掩码)用于提取、清除或设置目标位段的掩码通常通过左移生成举例先把4位对应的0xful清零(~按位取反)再赋值(或)4位对应的功能值(左移到对应的功能位置)#define SYS_GPF_MFPL_PF2MFP_Pos (8) /*! SYS_T::GPF_MFPL: PF2MFP Position */ #define SYS_GPF_MFPL_PF2MFP_Msk (0xful SYS_GPF_MFPL_PF2MFP_Pos) /*! SYS_T::GPF_MFPL: PF2MFP Mask /* PF.2 MFP */ #define SYS_GPF_MFPL_PF2MFP_GPIO (0x00ULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for GPIO */ #define SYS_GPF_MFPL_PF2MFP_EBI_nCS1 (0x02ULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for EBI_nCS1 */ #define SYS_GPF_MFPL_PF2MFP_UART0_RXD (0x03ULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for UART0_RXD */ #define SYS_GPF_MFPL_PF2MFP_I2C0_SDA (0x04ULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for I2C0_SDA */ #define SYS_GPF_MFPL_PF2MFP_QSPI0_CLK (0x05ULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for QSPI0_CLK */ #define SYS_GPF_MFPL_PF2MFP_XT1_OUT (0x0aULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for XT1_OUT */ #define SYS_GPF_MFPL_PF2MFP_BPWM1_CH1 (0x0bULSYS_GPF_MFPL_PF2MFP_Pos) /*! GPF_MFPL PF2 setting for BPWM1_CH1 */ int main() { //.. Uart0DefaultMPF(); //串口0功能脚定义 //.. } void Uart0DefaultMPF(void) { /* Set GPB multi-function pins for UART0 RXD and TXD */ SYS-GPF_MFPL (SYS-GPF_MFPL ~SYS_GPF_MFPL_PF2MFP_Msk) | SYS_GPF_MFPL_PF2MFP_UART0_RXD; SYS-GPF_MFPL (SYS-GPF_MFPL ~SYS_GPF_MFPL_PF3MFP_Msk) | SYS_GPF_MFPL_PF3MFP_UART0_TXD; }时钟输出CLK_EnableCKO(CLK_CLKSEL1_CLKOSEL_HIRC,1,1); //测试1- 48Mhz CLK_EnableCKO(CLK_CLKSEL1_CLKOSEL_HIRC,1,0); //测试1- 12Mhz Fre/2^(1 1) SYS-GPB_MFPH (SYS-GPB_MFPH ~SYS_GPB_MFPH_PB14MFP_Msk) | SYS_GPB_MFPH_PB14MFP_CLKO;1.2时钟树1.2.3 CLKO时钟输出时钟通过特定管脚输出选择PB.14是CLKOPA.3是CLKO3.系统定时器-延时delay_init()、delay_us()、delay_ms()SYS_CTRL控制寄存器 //时钟源、定时器使能、中断使能SYS_LOAD重装载寄存器 //当24位计数器减到0时该值载入到SYS_VAL寄存器中SYS_VAL当前值寄存器3.1编程步骤初始化时钟源 //确定Systick时钟频率知道1us计数值1ms对应乘1000写delay_us()、delay_ms()函数看需要是否要写中断函数写个延时1s(2个delay_ms(500))的灯闪烁函数看是不是1s不是测试-返回第1步修改☆☆先写了delay_ms(1000)函数实际测试延时不是1s经调试观察Systick寄存器值发现LOAD值溢出了24位寄存器0xFFFFFF对应的值为16777215而我这1000ms对应的值为24000000超出了所以延时失败考虑可以用2个delay_ms(500)实现120000000xFFFFFF没有溢出。void delay_init() { //我这里Systick时钟频率是48MHz/224MHz CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HIRC_DIV2); fac_us 24; // 1us就是走24下 fac_ms (uint16_t)fac_us*1000; // 1ms对应1ms乘1000 } void delay_us(uint32_t nus) { uint32_t temp; SysTick-LOADnus*fac_us; //延时几us就走几乘24下 SysTick-VAL0x00; //清零计数器让它从上面的值开始减 SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; //使能定时器开始运行 do { tempSysTick-CTRL; }while((temp0x01)!(temp(116))); //等着就好了等计数标志置位 SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; // 关掉计数器 SysTick-VAL 0X00; //清零计数器 不清也行吧反正下次会清 } void delay_ms(uint16_t nms) { uint32_t temp; SysTick-LOAD(uint32_t)nms*fac_ms; SysTick-VAL 0x00; SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; do { tempSysTick-CTRL; }while((temp0x01)!(temp(116))); SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; SysTick-VAL 0X00; } int main() { while(1) { PB111; delay_ms(500); delay_ms(500); //灯灭 PB110; delay_ms(500); delay_ms(500); //灯亮 } }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑