mini-arm-os 00-HelloWorld

00-HelloWord
├── hello.c
├── hello.ld
├── Makefile
├── reg.h
└── startup.c

  • 這個 helloworld 要做到從 USART2 輸出 “Hello World!”

reg.h 定義了各個 register 的 memory address, stm32的 memory map 參考這邊[1]

這個部份需要以下3個的 memory address

  • Reset and Clock Control
    • RCC
      • 0x4002 1000
    • RCC_APB2ENR   (APB2 peripheral clock enable register)
      • 0x4002 1000 + 0x18
    • RCC_APB1ENR  (APB1 peripheral clock enable register)
      • 0x4002 1000 + 0x1C
  • GPIO
    • GPIOA
      • 0x4001 0800
  • USART2
    • USART2
      • 0x4000 4400

hello.c 中,main function 共設定3了個部份

在一個一個拆開來看前,先看一下 system architechture

[1] p.38

 

STM32-p103 layout [2]

先在上面的 layout 看到,USART2_TX 用 PA2, USART2_RX 用 PA3,因此在GPIO_CRL跟GPIO_CRH的時候要設定CNF2/3與MODE2/3的部份。

首先要設定有關 APB clock 的部份,GPIOA在APB2,USART2在APB1,分別在其 register 設定為 enable。

第一行設定RCC_ABP2ENR的值為0x5,enable IOPAAFIO的部份。[3]
第二行設定RCC_ABP1ENR的值為0x20000, enable USART2 的部份。 [4]

接著先設定 GPIOA 的部份

最後設定 USART2 的部份

測驗

參考前面的code與spec, 把輸出的地方從 USART2 改為從 USART3 輸出。
 

 

Reference

[1] RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs
, http://www.keil.com/dd/docs/datashts/st/stm32f10xxx.pdf, p.41

[2] STM32-p103 layout, https://www.olimex.com/Products/ARM/ST/STM32-P103/resources/STM32-P103-sch.gif

[3] RM0008 Reference 6.3.7 APB2 peripheral clock enable register (RCC_APB2ENR), p.95

[4] RM0008 Reference 6.3.8 APB1 peripheral clock enable register (RCC_APB1ENR), p.97




如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.