步骤:1.配置GPIO为输出功能:修改con值。例:GPFCON[9:8]=0b01(0b表示二进制)→设置GPF4为输出。2.设置输出值,修改dat值。例:GPFDAT[4]=1 or 0; 123
汇编方法:
.text .global _start _start: LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器 @ 用于选择端口B各引脚的功能: @ 是输出、是输入、还是其他 MOV R1,#0x00000100 STR R1,[R0] @ 设置GPF4为输出口, 位[8:7]=0b01 LDR R0,=0x56000054 @ R0设为GPBDAT寄存器。此寄存器 @ 用于读/写端口B各引脚的数据 MOV R1,#0x00000000 @ 此值改为0x00000010, @ 可让LED1熄灭 STR R1,[R0] @ GPF4输出0,LED1点亮 MAIN_LOOP: B MAIN_LOOP
12345678910111213141516C语言方法:
**启动文件包括软件初始化和硬件初始化**软件初始化:1.设置返回地址2.调用main3.清理工作4.设置栈:SP栈指针指向某内存(默认SRAM,如果指向SDRAM则需要初始化SDRAM)硬件初始化:1.关闭看门狗2.初始化时钟(加快频率)3.初始化SDRAM 1234567891011
启动程序:
.text .global _start _start: ldr r0, =0x53000000 @ WATCHDOG寄存器地址 mov r1, #0x0 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K bl main @ 调用C程序中的main函数,并把返回地址放入lr寄存器 halt_loop: b halt_loop@ 清理工作 123456789101112
C语言程序:
#define GPFCON (*(volatile unsigned long *)0x56000050) #define GPFDAT (*(volatile unsigned long *)0x56000054) int main() { GPFCON = 0x00000100; // 设置GPF4为输出口, 位[9:8]=0b01 GPFDAT = 0x00000000; // GPF4输出0,LED1点亮 return 0; } 12345678910 2.按键点亮led
程序中注意位操作:清零用 & ,置1用 | 。 1
步骤:
1.配置KEYGPIO为输入功能;配置LEDGPIO为输出功能。
2.读取KEY,根据KEY值设置LED引脚输出。
C语言:
#define GPFCON (*(volatile unsigned long *)0x56000050) #define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPGCON (*(volatile unsigned long *)0x56000060) #define GPGDAT (*(volatile unsigned long *)0x56000064) /* * LED1,LED2,LED4对应GPF4、GPF5、GPF6 */ #defineGPF4_out(1<<(4*2)) #defineGPF5_out(1<<(5*2)) #defineGPF6_out(1<<(6*2)) #defineGPF4_msk(3<<(4*2)) #defineGPF5_msk(3<<(5*2)) #defineGPF6_msk(3<<(6*2)) /* * S2,S3,S4对应GPF0、GPF2、GPG3 */ #define GPF0_in (0<<(0*2)) #define GPF2_in (0<<(2*2)) #define GPG3_in (0<<(3*2)) #define GPF0_msk (3<<(0*2)) #define GPF2_msk (3<<(2*2)) #define GPG3_msk (3<<(3*2)) int main() { unsigned long dwDat; // LED1,LED2,LED4对应的3根引脚设为输出 GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk); GPFCON |= GPF4_out | GPF5_out | GPF6_out; // S2,S3对应的2根引脚设为输入 GPFCON &= ~(GPF0_msk | GPF2_msk); GPFCON |= GPF0_in | GPF2_in; // S4对应的引脚设为输入 GPGCON &= ~GPG3_msk; GPGCON |= GPG3_in; while(1){ //若Kn为0(表示按下),则令LEDn为0(表示点亮) dwDat = GPFDAT; // 读取GPF管脚电平状态 if (dwDat & (1<<0)) // S2没有按下 GPFDAT |= (1<<4); // LED1熄灭 else GPFDAT &= ~(1<<4); // LED1点亮 if (dwDat & (1<<2)) // S3没有按下 GPFDAT |= (1<<5); // LED2熄灭 else GPFDAT &= ~(1<<5); // LED2点亮 dwDat = GPGDAT; // 读取GPG管脚电平状态 if (dwDat & (1<<3)) // S4没有按下 GPFDAT |= (1<<6); // LED3熄灭 else GPFDAT &= ~(1<<6); // LED3点亮 } return 0; }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667零散知识:
volatile关键字表示确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
相关知识
宠物训练第二课—训练狗狗时,六大注意
嵌入式课程思政的三维模式及实施路径
[求助]正式服有个飞行训练第二课,怎么做的? NGA玩家社区
一种面向嵌入式平台的宠物睡眠识别方法
露天舞台第二课:表演小宠物(下)
第二课我的鸡蛋宝宝
基于嵌入式与物联网的智能电子宠物的设计
C语言打造即用型嵌入式宠物喂食机源码详解
宠物美容师第二课基础护理课程
宠物美容师第二课宠物基础护理课程
网址: 嵌入式第二课 https://m.mcbbbk.com/newsview578582.html
上一篇: 载体+场景=品牌特质,真融宝全新 |
下一篇: 泡面年糕披萨,简单食谱 |