開發記錄(A)week#7
 

作業要求(A):

  • 安裝和設定 QEMU
  • 依據指示,將 00-Semihosting, 00-HelloWorld, …, 07-Threads 均實際測試並研讀程式碼
  • 在 github 上 fork mini-arm-os,並修改 07-Threads (不要增加新的目錄!),提供基本的 shell,然後能夠用新建立的 thread 計算 fibonacci 數列
  • shell 程式碼可參照 rtenv+ 的 main.c,裡頭提供 shell 實做
  • 建立新的 Hackpad,列於「+作業區」,需要標注「開發紀錄 (A)」
 
<前導紀錄>
環境設置參考這份:+Build minimal ARM Kernel from Scratch
沒有概念要入門也可以先讀這份:+Build minimal ARM Kernel from Scratch 和這份 STM32 程式開發:以 GNU Toolchain 為例 ,後者較詳細,有對 Register 做較詳盡的解釋
 
 

開發記錄

 00-Hello_World
在 00-Hello_world 中我認為先了解Memory map 的意義會知道要做出一個 hello world 需要哪些register,或許對之後七個範例也能夠更快上手所以優先來看 reg.h ,裡面有三種 Memory map:
  1. RCC : Reset and clock control
  • AMBA (Advanced Micro-controller Bus Architecture):APB (peripheral Bus)、AHB ,這兩個名詞代表的似乎是資料傳輸的架構,分成兩個功用在於區分資料傳輸的方法
  1. GPIO:General purpose Input/output
  1. UART & USART :週邊硬體,可以傳輸資料也可接收資料
 
稍微看了一些register的定義,以後需要用到會需要參考這份資料:http://www.keil.com/dd/docs/datashts/st/stm32f10xxx.pdf
 
reg.h看完,來看 hello.c 裡面的程式碼
如果瞭解在寫程式的時候需要對 register 做哪些設定之後才能使用,應該就很好懂!
       *(RCC_APB2ENR) |= (uint32_t) (0x00000001 | 0x00000004);
       I/O port A clock enable & Alternate function I/O clock enable
        *(RCC_APB1ENR) |= (uint32_t) (0x00020000);
       USART 2 clock enable
       APB1 APB2 的設定可以在stm32f10xxx.pdf,這份文件的P.95看到
        /* USART2 Configuration */
        *(GPIOA_CRL) = 0x00004B00;
       CNF2[11:10] = 10 ( Alternate function output Push-pull)
       MODE2[9:8]=11 ( Output mode, max speed 50 MHz.)
       知道在設定USART2,但不懂他在做啥
        *(GPIOA_CRH) = 0x44444444;
        0x44444444 = Reset Value (既然是reset value,為何要在做一次?)
        *(USART2_CR1) = 0x0000000C;
        對 TE & RE 做設定,設定為 Enabled
        *(USART2_CR1) |= 0x2000;
        13 bit Enable USART 
 
        //TE RE節錄完整的設定內容,
Bit 3 TE: Transmitter enable
This bit enables the transmitter. It is set and cleared by software.
Note: 1: During transmission, a “0” pulse on the TE bit (“0” followed by “1”) sends a preamble