测试方法:实现输入按键控制和输出点亮LED,输入可以控制LED闪烁速度
串口可以打印出闪烁的周期。
GPIO的初始化
void led_init(void)
{
GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT);
PB14 = 1;
}
//初始化按键的端口为输入模式
void button_init(void)
{
GPIO_SetMode(PH, BIT4, GPIO_MODE_INPUT);
}
实现LED闪烁,并通过传入一个参数控制延时周期
void led_blink(int i)
{
while(i--)
CLK_SysTickDelay(100000);
PB14 ^=1;
}
这里使用了库函数进行延时,最小延时单元设置为0.1s,即100000us。通过传入的变量i,可以控制多少个0.1s后进行翻转。
按键输入用于控制一个变量从10到1循环变化,通过指针传入该变量的地址。
//通过按键改变一个数字从10到1的变化,用于控制LED闪烁的频率。
void get_button(int *i)
{
if(PH4==0)
{
CLK_SysTickDelay(1000);
if(PH4==0)
{
while(PH4==0);
(*i)--;
if(*i<=0) *i=10;
printf("i=%d T=%.2f s \n",*i,(float)*i/5);
}
}
}
每次完成一次变量改变后,打印出变量值和当前对应的周期。代码实现了松手检测,按下后,先延时确认是否真的按下,如果是按下了,那么等待松手,松手后进行变量的减一操作,然后判断变量是否循环到0,然后主函数调用他们。
int32_t main(void)
{
int i=10;
/* Init System, IP clock and multi-function I/O. */
SYS_Init();
/* Init UART0 for printf */
UART0_Init();
printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);
printf("+-------------------------------------------------+\n");
printf("| PB.14(Output) and PCH.4(Input) Sample Code |\n");
printf("+-------------------------------------------------+\n\n");
led_init();
button_init();
while(1)
{
led_blink(i);
get_button(&i);
}
}
最后串口打印的效果如下,完整的工程看附件,可以放到
M471_Series_BSP_CMSIS_V3.00.000\SampleCode\StdDriver
这个目录下,因为我是用GPIO的例子复制了一份,修改的。