学习一个新的片子,无外乎就是掌握他的外设,知道他的外设限制在哪里,功能在哪里,然后就能针对性的应用在项目上,我就按照官方例子都走一遍,结合手册来食用.
https://github.com/raspberrypi/pico-examples
第一个例子是Hello serial,顾名思义,就是打印东西呗,这个很简单,但是需要焊接排针,并且打印是从默认串口出来的.何为默认串口?看到深色的UART0嘛.
既然是printf,应该可以传递参数,所以我就改了改程序试试.
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdio.h>
#include "pico/stdlib.h"
int main() {
uint8_t i = 0;
stdio_init_all();
while (true) {
printf("Hello, world! %d\n", i++);
sleep_ms(300);
}
return 0;
}
其中stdio_init_all主要是初始化UART和USB功能,实现printf重载,只要用了它后续就可以用stdio标准打印函数了.
想把他改成USB输出也很简单,其中USB serial工程里只修改了cmake文件,注意查看新增内容,即默认输出是UART,可改为USB,但是我测试如果同时启用,将会编译警告,但是也可以用.
可以看到通过USB模拟的串口.
不过,stdio究竟实现了多少,包含getch吗?这直接会影响到我们的一些交互操作.
在First Examples的最后一个例子是操作IO,代码相当简单,就不多说了.
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
const uint LED_PIN = 25;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
}
当然针对RP2040这个芯片来说,自身还有一些系统函数和组件,比如获取序列号.
int main() {
stdio_init_all();
pico_unique_board_id_t board_id;
pico_get_unique_board_id(&board_id);
printf("Unique identifier:");
for (int i = 0; i < PICO_UNIQUE_BOARD_ID_SIZE_BYTES; ++i) {
printf(" %02x", board_id.id[i]);
}
printf("\n");
}
或者因为某些骚操作原因,想复位某个外设,就像把复位引脚拉高拉低一样.
// 复位PWM外设
reset_block(RESETS_RESET_PWM_BITS);
unreset_block_wait(RESETS_RESET_PWM_BITS);
还有诸如队列,锁等等的辅助功能,都在SDK内有提供,这个需要慢慢学习了.