fork download
  1. /**
  2.  * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
  3.  *
  4.  * SPDX-License-Identifier: BSD-3-Clause
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include "pico/stdlib.h"
  9. #include "hardware/structs/watchdog.h"
  10.  
  11. // Это приложение показывает влияние записи байтов и полуслов на регистры ввода/вывода. Все
  12. // регистры ввода-вывода на RP2040 будут производить выборку всей 32-битной шины данных записи при любой
  13. // записи; размер передачи и 2 младших бита адреса "игнорируются".
  14. //
  15. // Это может привести к неинтуитивным результатам, особенно с учетом того, как шинные мастера RP2040
  16. // реплицируют узкие данные записи по всей 32-битной шине данных записи.
  17. // Однако такое поведение может быть весьма полезным, если вы о нем знаете!
  18.  
  19. int main() {
  20. stdio_init_all();
  21.  
  22. // Мы будем использовать WATCHDOG_SCRATCH0 как удобный 32-битный регистр чтения / записи,
  23. // которому мы можем присвоить произвольные значения.
  24. io_rw_32 *scratch32 = &watchdog_hw->scratch[0];
  25. // Псевдоним временного регистра как два полуслова со смещениями +0x0 и +0x2
  26. volatile uint16_t *scratch16 = (volatile uint16_t *) scratch32;
  27. // Псевдоним временного регистра как четыре байта со смещениями +0x0, +0x1, +0x2, +0x3:
  28. volatile uint8_t *scratch8 = (volatile uint8_t *) scratch32;
  29.  
  30. // Покажем, что мы можем читать/записывать рабочий регистр как обычно:
  31. printf("Запись тридцатидвухбитного значения\n");
  32. *scratch32 = 0xdeadbeef;
  33. printf("Должно быть 0xdeadbeef: 0x%08x\n", *scratch32);
  34.  
  35. // Мы можем выполнять узкие чтения просто отлично - регистры ввода-вывода обрабатывают это как 32-битное
  36. // чтение, а процессор/контроллер прямого доступа к памяти выберет правильные байтовые полосы на основании
  37. // размера передачи и адресов LSB.
  38. printf("\nЧтение по одному байту за раз\n");
  39. // Little-endian!
  40. printf("Должно быть ef be ad de: %02x %02x %02x %02x\n",
  41. scratch8[0], scratch8[1], scratch8[2], scratch8[3]);
  42.  
  43. // Cortex-M0+ и контроллер прямого доступа к памяти RP2040 реплицируют байтовые записи по шине,
  44. // а регистры ввода-вывода всегда производят выборку всей шины записи.
  45. printf("\nЗапись восьмибитного значения 0xa5 so smecheniem 0\n");
  46. scratch8[0] = 0xa5;
  47. // Прочитаем весь регистр за раз
  48. printf("Должно быть 0xa5a5a5a5: 0x%08x\n", *scratch32);
  49.  
  50. // Регистр ввода-вывода игнорирует младшие биты адреса [1: 0], а также размер передачи,
  51. // поэтому не имеет значения, какое смещение байта мы используем.
  52. printf("\nЗапись восьмибитного значения со смещением 1\n");
  53. scratch8[1] = 0x3c;
  54. printf("Должно быть 0x3c3c3c3c: 0x%08x\n", *scratch32);
  55.  
  56. // Запись половинного слова также реплицируется через шину записи данных.
  57. printf("\nЗапись шестнадцатибитного значения со смещением 0\n");
  58. scratch16[0] = 0xf00d;
  59. printf("Должно быть 0xf00df00d: 0x%08x\n", *scratch32);
  60. }
  61.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:8:10: fatal error: pico/stdlib.h: No such file or directory
 #include "pico/stdlib.h"
          ^~~~~~~~~~~~~~~
compilation terminated.
stdout
Standard output is empty