‌树莓派Pico‌的timer

pico-sdk-api文档

rp2040-datasheet.pdf

getting-started-with-pico.pdf

树莓派 Pico 之可编程 IO(PIO)

diagram.json

json 复制代码
{
  "version": 1,
  "author": "wang minglie",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-pi-pico",
      "id": "pico",
      "top": -3.15,
      "left": 3.6,
      "attrs": { "builder": "pico-sdk" }
    },
    { "type": "wokwi-logic-analyzer", "id": "logic1", "top": -143.65, "left": 326.4, "attrs": {} }
  ],
  "connections": [
    [ "pico:GP0", "$serialMonitor:RX", "", [] ],
    [ "pico:GP1", "$serialMonitor:TX", "", [] ],
    [ "pico:GP21", "logic1:D0", "green", [ "h116.4", "v-230.4", "h19.2", "v-38.4" ] ]
  ],
  "dependencies": {}
}

wokwi.toml

xml 复制代码
[wokwi]
version = 1
firmware = "cmake-build-debug-pico/pio_squarewave.uf2"
elf = "cmake-build-debug-pico/pio_squarewave.elf"

main.c

10us 进入一次定时器中断

c 复制代码
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
#include "hardware/irq.h"

#define ALARM_NUM 0
#define ALARM_IRQ TIMER_IRQ_0

const uint LED_PIN = 21;

// 每 10 微秒触发一次中断
#define PERIOD_US 10+1

// 中断处理函数:每 1µs 翻转 GPIO
static void timer0_irq_handler(void) {
    // 清除 timer0 中断标志
    hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);

    // 翻转 LED 电平
    gpio_xor_mask(1u << LED_PIN);

    // 设置下一次中断(当前时间 + 1µs)
    uint32_t next = timer_hw->timerawl + PERIOD_US;
    timer_hw->alarm[ALARM_NUM] = next;
}

static void init_timer0_interrupt(void) {
    // 清中断标志
    hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);

    // 使能 timer0 中断
    hw_set_bits(&timer_hw->inte, 1u << ALARM_NUM);

    // 注册中断处理函数
    irq_set_exclusive_handler(ALARM_IRQ, timer0_irq_handler);
    irq_set_enabled(ALARM_IRQ, true);

    // 第一次触发:当前时间 + PERIOD_US
    timer_hw->alarm[ALARM_NUM] = timer_hw->timerawl + PERIOD_US;
}

int main() {
    stdio_init_all();

    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    gpio_put(LED_PIN, 0);   // 初始为低电平

    init_timer0_interrupt();

    // 主循环不做任何事
    while (true) {
        tight_loop_contents();
    }
}
相关推荐
蜀黍@猿3 小时前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu
La Pulga4 天前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
星野云联AIoT技术洞察5 天前
传统设备接入 Tuya:从 DP、串口联调到样机与 OTA 验收
mcu·智能家居·涂鸦智能·涂鸦开发·tuya生态接入·tuya开发·mcu sdk
意法半导体STM326 天前
【官方原创】LAT1717 STM32N6 如何使用单个XSPI驱动双片相同HyperRAM
stm32·单片机·嵌入式硬件·mcu·stm32n6·hyperram
La Pulga7 天前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
La Pulga8 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
La Pulga10 天前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
La Pulga10 天前
【FreeRTOS源码学习笔记】任务创建
笔记·stm32·mcu·学习·嵌入式·freertos·实时操作系统
secondyoung12 天前
Cortex-R52与TriCore详细对比
arm开发·单片机·嵌入式硬件·mcu
电子科技圈12 天前
芯科科技2026年Tech Talks技术系列讲座再增添全新主题共探无线SoC架构演进与安全合规
科技·嵌入式硬件·mcu·物联网·安全·架构·iot