一、hw原理图

按键key0接到了UART1_CTS , 默认情况下KEY0为高,当按下KEY0之后,UART1_CTS 为低
二、sw
1、设置UART1_CTS复用为GPIO1_IO18
2、设置UART1_CTS的电气属性
3、配置GPIO1_IO18为输入模式
4、读取按键值也就是GPIO1_IO18的高低电平
三、加上清除bss段,代码不运行
_bsss_start = 0x87800289。对于32位的soc,访问是以4字节访问的。因此从0x87800288开始,清除bss段。
然而0x87800288不属于bss段。所以需要对 _bss_start 进行4字节对齐。_bss_start应该等于0x8780028c
imx6ul.lds
点号(定点计数器)与等号之间
冒号两侧
最好都加上空格
SECTIONS{
. = 0x87800000;
.text :
{
obj/start.o
*(.text)
}
.data ALIGN(4) : {*(.data)}
.rodata ALIGN(4) : {*(.rodata)}
. = ALIGN(4); <---------------设置定点计数器对齐
__bss_start = .;
.bss ALIGN(4) : {*(.bss) *(COMMON)}
__bss_end = .;
}
此时可以看到 _bss_star t的地址是4字节对齐的
start.s
Warning: end of file not at end of a line; newline inserted
文件结尾留一个空行,即可解决该warning
.global _start
.global _bss_start
_bss_start :
.word __bss_start
.global _bss_end
_bss_end :
.word __bss_end
_start:
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0x13
msr cpsr,r0
ldr r0,_bss_start
ldr r1,_bss_end
mov r2,#0
bss_loop:
stmia r0!,{r2}
cmp r0,r1
ble bss_loop
ldr sp,=0x80200000
b main
gpio读写驱动
#include"bsp_gpio.h"
int gpio_pinread(GPIO_Type *base,int pin)
{
return (((base->DR)>>pin) & 0x1);
}
void gpio_pinwrite(GPIO_Type *base,int pin,int value)
{
if(value == 0)
{
base->DR &= (~(1<<pin));
}
else if(value == 1)
{
base->DR |= (1<<pin);
}
}
void gpio_init(GPIO_Type *base,volatile int pin,gpio_pin_config *config)
{
if(config->dir == kGPIO_DigitalInput)
{
base->GDIR &= (~(1<<pin));
}
else
{
base->GDIR |= (1<<pin);
gpio_pinwrite(base,pin,config->outputLogic);
}
}
/dev/sdb 出现错误,就重启解决
定义一个结构体指针,在给它赋值,报错。要用malloc先分配空间,在p->member赋值
取消-O2优化编译 也没有问题的
\ + 字符 , 可以屏蔽掉这个字符的特殊效果,使其原样输出。
本文详细介绍了在特定硬件平台上实现按键检测的方法,包括硬件连接、软件配置步骤及清除BSS段的正确做法。同时,提供了GPIO读写驱动的实现代码,并解决了编译警告问题。
472

被折叠的 条评论
为什么被折叠?



