1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Hướng dẫn làm quen với STM8F103

14 3,9K 9

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 69,33 KB

Nội dung

Đây là một bài viết tổng hợp kinh nghiệm lập trình STM8 của mình sau 1 thời gian tìm hiểu nghiên cứu dòng vi điều khiển giá rẻ mà ngon này. Hy vọng nó giúp ích cho anh em có 1 tài liệu nhỏ nghiên cứu nó

Trước khi bắt đầu với những bài viết hướng dẫn các bạn tiếp cận với từng ngoại vi cụ thể trên chip STM8. Bài viết hôm nay Ano xin được giới thiệu tới các bạn cấu trúc phần cứng của STM8. Từ đó sẽ giới thiệu mục lục các bài viết hướng dẫn sử dụng các ngoại vi trên STM8 để các bạn tiện theo dõi. Mục tiêu cụ thể : Có cái nhìn tổng quát về cấu trúc phần cứng của chip STM8. Những vấn đề cần lưu ý trong thiết kế phần cứng ứng dụng chip STM8. Ok ! chúng ta bắt đầu thôi. Central Processing Unit (CPU) : được thiết kế với kiến trúc 8-bit, bao gồm 6 thanh ghi cho phép thực thi hiệu quả 80 lệnh trong tập lệnh của CPU. 6 thanh ghi của CPU bao gồm : • Accumulator (A). • Index Registers (X and Y). • Program Counter (PC). • Stack Pointer (SP). • Codition Code Register(CC). Bootloader : vi chương trình hỗ trợ bootloader của STM 8 được nạp sẵn trong ROM nội (dung lượng 2Kbyte ) của STM8 . cũng giống như các trình bootloader khác, chương trình bootloader trên STM8 có nhiệm vụ nạp chương trình ứng dụng của người dùng vào bộ nhớ flash /eeprom (nằm trong chip) thông qua các chuẩn giao tiếp SPI,UART, CAN. Cấu trúc bộ nhớ : sử dụng bộ nhớ flash để chứa chương trình thực thi và bộ nhớ EEPROM để chứa dữ liệu. Người dùng hoàn toàn có thể sử dụng các lệnh tác động vào các thanh ghi điều khiển để thực hiện các thao tác đọc ghi vào các bộ nhớ này. Debug Module : thông qua module giao tiếp đơn dây SWIM (single wire interface module) STM8 hỗ trợ người dùng các thanh ghi điều khiển cho phép người dùng tác động trực tiếp vào các thanh ghi của CPU để có thể thực hiện debug chương trình ứng dụng trên phần cứng đang hoạt động. Bộ điều khiển ngắt (ITC) : Đây là khối quản lý ngắt tập trung trên chip STM8. Cho phép quản lý các ngắt phần cứng (các yêu cầu ngắt từ các chân I/O hay từ các ngoại vi) và các ngắt phần mềm (TRAP). Có thể phân chia thành 4 cấp ưu tiên với tổng cộng 32 ngắt. Các ngắt này được quản lý bởi các thanh ghi sau : • Bit I1 và I0 trong thanh ghi CCR. • Thanh ghi software priority registers (ITC_SPRx). Power Supply : Sử dụng 4 khối nguồn sau : • VDD/VSS : điện áp cung cấp 3V- 5.0V , đây là khối nguồn nuôi chính cho MCU hoạt động. • VDDO/VSSO : điện áp từ 3V – 5V, đây là khối nguồn dùng cho các chân I/O (tùy thuộc vào từng package mà sẽ có 1 hay 2 cặp chân VDDO/VSSO). • VDDA/VSSA : nguồn nuôi cho các khối analog bên trong MCU. • VREF+/VREF- : điện áp tham chiếu cho khối ADC. Tín hiệu RESET (RST): Hỗ trợ các tín hiệu reset sau: • Reset ngoài thông qua chân NRST. • Power-on reset (POR). • Brown-out reset (BOR). • Independent watchdog reset (IWDG). • Window watchdog reset (WWIG). • Software reset. • SWIM reset. • Illegal opcode reset. • EMC reset. Clock Control : Được thiết kế cho phép ứng dụng của bạn được thực hiện với hiệu suất cao tiết kiệm công suất tiêu thụ của CPU. Cho phép bạn có thể quản lý nguồn tần số xung clock cung cấp cho từng ngoại vi từ tần số xung clock chính dựa vào các bộ chia tần số. Có 4 nguồn xung clock có thể được sử dụng để tạo ra tần số xung clock chính cung cấp cho CPU : • Nguồn xung clock thạch anh bên ngoài(HSE) : 1 – 24Mhz • Nguồn xung user-external HSE user-ext: 24Mhz • Bộ dao động nội RC tốc độ cao (HSI): 16Mhz • Bộ dao động nội RC tốc độ thấp (LSI): 18Khz Quản lý năng lượng : Sau khi reset, CPU sẽ chạy vào chế độ Run Mode. Trong chế độ này, tần số xung clock của CPU sẽ là fCPU và thực thi chương trình. Trong chế độ Run Mode thì chúng ta có thể có một số cách để giảm điện áp tiêu thụ : • Giảm tốc độ xung clock của hệ thống. • Tập hợp các tần số xung clock của các ngoại vi riêng lẻ khi không sử dụng chúng • Tắt các ngoại vi analog khi không sử dụng đến chúng. Tuy nhiên không phải lúc nào cũng chạy ở chế độ Run Mode, để giảm điện năng tiêu thụ cho CPU chúng ta có thể cho CPU chạy ở các chế độ khác tiêu thụ điện năng thấp hơn như : • Wait. • Active- Halt. • Halt. Tiếp theo sau đây là danh sách các bài viết hướng dẫn giao tiếp ngoại vi tiếp theo trong series này: • UART. • Ngắt • Timer. • ADC. Bước đầu làm quen với STM8 - Creating Project GPIO Chào các bạn . Hy vọng các bạn đều thành công với bài viết trước của mình. Hôm nay, bài viết tiếp theo trong series này sẽ hướng dẫn các bạn cách tạo 1 project với STVD + Cosmic. Chúng ta sẽ thực hiện tạo project sử dụng thư viện ngoại vi GPIO. Ở đây, ta sẽ thực hiện ứng dụng điều khiển led LD1 trên KIT STM8s Discovery nhấp nháy. Để thuận tiện cho việc tiếp cận, Ano có xây dựng sẵn 1 project_template (trong file đính kèm). Các bạn download file này về và tiến hành giải nén nó ra desktop nha. Bây giờ chúng ta bắt đầu với project đầu tiên của mình. Mở chương trình STVD lên (cách mở thì các bạn tham khảo bài viết trước của mình nha). Click File > Open workspace Hộp thoại Open workspace hiện ra và bạn chọn đường dẫn tới STVD_workspace.stw trong thư mục project_template của mình. Cụ thể đường dẫn ở đây như sau : Desktop\Project_template\Project\STVD\Cosmic\STVD_ workspace.stw chonj vào file STVD_workspace.stw và click open. Sau khi chúng ta đã mở thành công worspace. Chúng ta làm tiếp bước tiếp theo là add các thư viện ngoại vi vào chương trình, như đã nói ở trên, trong ví dụ này chúng ta sẽ sử dụng thư viện ngoại vi GPIO của STM8. Cách add thư viện ngoại vi GPIO nhu sau : Bước 1 : add header file stm8s_gpio.h của thư viện GPIO, cách thực hiện như sau : Trong cửa sổ worksapce của chương trình, bạn Right click vào Include Files sau đó Left click vào Add Files to Folder như hình sau : cửa sổ open mở ra, bạn chọn đường dẫn tới file stm8s_gpio.h của thư viện GPIO trong thư mục project_template, cụ thể đường dẫn như sau: \Desktop\demo_gpio\Libraries\STM8S_StdPeriph_Drive r\inc\stm8s_gpio.h click vào chọn file stm8s_gpio.h và click vào open. Bước 2 :add source file stm8s_gpio.c của thư viện GPIO, cách thực hiện như sau : Trong cửa sổ worksapce của chương trình, bạn Right click vào Source Files sau đó Left click vào Add Files to Folder như hình sau : cửa sổ open mở ra, bạn chọn đường dẫn tới file stm8s_gpio.c của thư viện GPIO trong thư mục project_template, cụ thể đường dẫn như sau:\Desktop\demo_gpio\Libraries\STM8S_StdPeriph_Drive r\src\stm8s_gpio.c click vào chọn file stm8s_gpio.c và click vào open. Sau khi tiến hành add file xong. Bây giờ chúng ta bắt đầu viết code cho file main.c trong thư mục Source Files của cửa sổ workspace. Đầu tiên ta khai báo thư viện ngoại vi được sử dụng : Code: #include "stm8s.h" #include "stm8s_gpio.h" Ở đây : #include "stm8s.h" là có sẵn trong file main.c bạn không cần chỉnh sửa gì cả. #include "stm8s_gpio.h" đây là header của thư viện ngoại vi GPIO mà mình sẽ dùng trong ví dụ này, sau này bạn muốn dùng thư viện ngoại vi nào thì chỉ cẩn add file của thư viện đó (như trên) và tiến hành khai báo trong main.c Tiếp theo define chân dùng để điều khiển led. Theo thiết kế thì led LD1 trên KIT được điều khiển bởi chân(pin) 0 của cồng (port) D , vì vậy ta tiến hành khai báo như sau : Code: #define LED_GPIO_PORT (GPIOD) #define LED_GPIO_PINS (GPIO_PIN_0) Khai báo prototype cho hàm con Delay(). Hàm này dùng để tạo thời gian delay giữa các lần nhấp nháy của led. Code: void Delay (uint16_t nCount); Tiếp theo, ta edit code cho hàm void main() như sau : Code: void main(void) { /* Initialize I/Os in Output Mode */ GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST); while (1) { /* Toggles LEDs */ GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); Delay(0xFFFF); } } Nói một chút về chương trình trên nhỉ. _ Hàm GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST); có tác dụng sẽ khởi động và thiết lập chân 0 của cổng D(chân dùng để điều khiển Led LD1) theo kiểu : Output push-pull, low level, 10MHz (chi tiết cụ thể về các mode của GPIO các bạn tham khảo reference manual). _Hàm GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); sẽ thưc hiện thao tác đọc trạng thái hiện tại của chân 0 cổng D, sau đó đảo trạng thái đó lại và xuất ngược trở lại chân 0 cổng D. Cụ thể : Nếu trạng thái hiện tại là 1 thì nó sẽ chuyển sang giá trị 0 và xuất ra. Nếu trạng thái hiện tại là 0 thì nó sẽ chuyển sang giá trị 1 và xuất ra. _ Hàm Delay (): tạo thời gian delay giữa các lần chuyển trạng thái của chân 0 cổng D. Viết code cho hàm Delay() như sau : Code: void Delay(uint16_t nCount) { /* Decrement nCount value */ while (nCount != 0) { nCount ; } } Sau đó ta lưu lại code vừa viết. Kết nối kit vào PC và tiến hành compile và debug chương trình. (Cách thực hiện tham khảo bài viết trước của mình). Cách bạn có thể thử thay đổi thời gian delay, hoặc dùng các hàm khác trong thư viện ngoại vi để thực hiện điều khiển nhấp nháy led. Bước đầu làm quen với STM8 - TIMER và Interrupt Chào các bạn ! Hôm nay Ano xin tiếp tục series hướng dẫn sử dụng ngoại vi trên STM8. Trong bài viết hôm nay mình xin hướng dẫn các bạn thực hiện một demo nhỏ sử dụng ngoại vi Timer của SMT8. Đồng thời cũng trong bài viết này, mình sẽ hướng dẫn cách sử dụng interrupt trong SMT8s bằng việc sử dụng interrupt của Timer. Cấu trúc bài viết của ngày hôm nay như sau : Phần 1 : • Giới thiệu về Timer trong STM8 • Giới thiệu về bộ quản lý interrupt trong SMT8 Phần 2 : Thực hiện demo như sau : thiết lập Timer 2 chạy ở chế độ Timming. Khi có ngắt xảy ra thì thực hiện bật tắt led LD1 trên kit. Vậy là xong khúc dạo đầu, mình vào phần chính nhá. Hihi Phần 1 : Giới thiệu về Timer trong STM8 : Các bộ timer trong STM8S và STM8A hỗ trợ đầy đủ 3 loại sau : • Advanced Control : TIM1 • Gerenal purpose : TIM2/TIM3/TIM5 • Basic timer : TIM4/TIM6 Tất cả các timer này đều có chung một cấu trúc, tuy nhiên mỗi loại sẽ có một số thiết kế đặc trưng nhất định. Về cấu trúc chung của các timer sẽ bao gồm một số thanh ghi với các chức năng cơ bản của bộ timer giúp người dùng dễ dàng phát triển nhanh các thiết kế. Thông tin chi tiết về cấu trúc cũng như hoạt động của các bộ TIMER, các bạn có thể tham khảo trong các tài liệu kỹ thuật được cung cấp bởi ST. Sau đây là bảng tóm tắt chức năng chính của các bộ TIMER trong STM8. Giới thiệu về bộ quản lý interrupt trong chip STM8 : Bộ quản lý interrupt cho phép quản lý ngắt phần cứng cũng như các ngắt phần mềm phát sinh. Được thiết kế theo kiểu ngắt lồng nhau, với nhiều cấp và mức ưu tiên khác nhau bao gồm : • 4 cấp ưu tiên cho các ngắt phần mềm. • 32 ngắt phần cứng. • 2 ngắt che mặt nạ : RESET, TRAP • 1 ngắt không che mặt nạ Cấu trúc chung cho bộ quản lý ngắt : • ITC dựa trên các bit : I0 và I1 trong thanh ghi CCR. • Thanh ghi quản lý ưu tiên ngắt phần mềm Phần 2 : Các bạn thực hiện lần lượt từng bước sau : Mở project_template , thực hiện add các header và source file : - stm8s_gpio.c - stm8s_tim2.c - stm8s_gpio.h - smt8s_tim2.h Theo mẫu sau: Sau khi add các thư viện vào như trên, chúng ta bắt đầu edit code: Trong file main.h Thực hiện add các header file của thư viện vào hàm main : Code: #include "stm8s.h" #include "stm8s_tim2.h" #include "stm8s_gpio.h" #include "stm8s_it.h" Define chân GPIO cho ứng dụng, ở đây sử dụng led LD1. Code: #define LED_GPIO_PORT (GPIOD) #define LED_GPIO_PINS (GPIO_PIN_0) Trong file main.c Thực hiện edit code như sau : Các khai báo Biến toàn cục Code: uint16_t CCR1_Val = 500; Thực hiện edit hàm void main () như sau : Code: void main(void) { int i; GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); /* Time base configuration */ //TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999); TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 999); /* Prescaler configuration */ TIM2_PrescalerConfig(TIM2_PRESCALER_2048, TIM2_PSCRELOADMODE_IMMEDIATE); /* Output Compare Active Mode configuration: Channel1 */ /* TIM2_OCMode = TIM2_OCMODE_INACTIVE TIM2_OCPolarity = TIM2_OCPOLARITY_HIGH TIM2_Pulse = CCR1_Val */ TIM2_OC1Init( TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH); TIM2_OC1PreloadConfig(ENABLE); /* ARRPreload Enable */ TIM2_ARRPreloadConfig(ENABLE); /* Update Interrupt Enable */ TIM2_ITConfig(TIM2_IT_UPDATE , ENABLE); /* Enable TIM1 */ TIM2_Cmd(ENABLE); enableInterrupts(); while (1) { } } Giải thích code một chút nha : Ở đây ta sẽ bắt đầu giải thích code cho phần TIM và interrupt, phần GPIO các bạn tham khảo trong bài viết trước của mình. Code: TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 999); Thiết lập thông số cơ bản của bộ TIM2 với giá trị ARR = 999 và giá trị prescale = 2048 Code: /* Prescaler configuration */ TIM2_PrescalerConfig(TIM2_PRESCALER_2048, TIM2_PSCRELOADMODE_IMMEDIATE); Thiết lập định dạng prescale config. Code: TIM2_OC1Init( TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH); Thiết lập giá trị cho cho channel 1 của TIM2. Code: TIM2_OC1PreloadConfig(ENABLE); /* ARRPreload Enable */ TIM2_ARRPreloadConfig(ENABLE); Cho phép reload các giá trị trong các thanh ghi OC và ARR. Code: TIM2_ITConfig(TIM2_IT_UPDATE , ENABLE); Thiết lập ngắt cho TIM2 khi TIM2 thực hiện update lại các giá trị Code: TIM2_Cmd(ENABLE); Cho phép TIM2 chạy Code: enableInterrupts(); Cho phép hoạt động bộ quản lý ngắt. Thực hiện edit code cho file stm8_it.c như sau : Tìm tới phần khai báo cho ngát TIM2 update: [...]... TIM2_ClearITPendingBit(TIM2_IT_UPDATE); Xóa cờ ngắt tim2_update Sau khi thực hiện code các bạn có thể biên dịch và cho chạy thử ứng dụng Bước đầu làm quen với STM8 - ADC + Interrupt Chào các bạn ! Hôm nay Ano xin trở lại series hướng dẫn các bạn tiếp cận dòng vi điều khiển STM8 của hãng ST với bài viết về ADC ADC là gì và chức năng ra sao thì chắc mọi người cũng đã rõ Vì vậy, Ano sẽ không nói tới vấn đề này nữa, trong... tới vấn đề này nữa, trong bài viết hôm nay Ano xin trình bày những ý sau Phần 1 : Giới thiệu về cấu trúc khối ADC trong STM8 Phần 2: Thực hiện ứng dụng với khối ADC, trong bài viết này, Ano cũng sử dụng ngắt cho việc cập nhật giá trị ADC Mong rằng cùng với bài viết về timer trước các bạn có thể sử dụng các ngắt của STM8 thành thạo (vai trò của ngắt trong lập trình vi điều khiển quan trọng như thế nào... như thế nào thì chắc các bác cũng đã rõ) Chúng ta bắt đầu thôi ! Phần 1 : Giới thiệu cấu trúc khối ADC trong STM8 Hiện tại, trên các sản phẩm dòng STM8 của ST hỗ trợ tối đa 2 khối ADC là : ADC1 và ADC2 Với các thông số chính như sau : • Độ phân giải 10 bit • Có thể hoạt động ở 2 mode : Single or Continuous • Cho phép xác lập tần số hoạt động của bộ ADC • Tầm điện áp hoạt động : VSSA < Vin < VDDA Ở đây,... • Hỗ trợ Scan mode cho cả 2 chế độ hoạt động là Single or Continuous • Analog watchdog, bao gồm cả ngưỡng trên và ngưỡng dưới • Tạo ra xung ngắt cho mỗi sự kiện analog watchdog Phần 2 : Thực hiện demo với ADC + Interrupt Mở project_template và thưc hiện add các file thư viện vào như hình sau : Chú ý ở đây chúng ta sẽ add vào 2 file : stm8s_adc1.h : header file stm8_adc1.c : source file Sau khi add các... ADC1 */ GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); Ở đây ta sử dụng chanel 9 của ADC 1, chân ngõ vào tín hiệu của chanel 9 là chân PE6, vì vậy đoạn code trên được sử dụng để config cho chân PE6 làm ngõ vào tín hiệu cho khối ADC1 Code: /* De-Init ADC peripheral*/ ADC1_DeInit(); /* Init ADC2 peripheral */ ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2, \ ADC1_EXTTRIG_TIM,... file stm8s_adc1.h của thư viện giao tiếp ngoại vi STM8s Code: /* Enable EOC interrupt */ ADC1_ITConfig(ADC1_IT_AWS9,ENABLE); /* Enable general interrupts */ enableInterrupts(); Cho phép thực hiện ngắt với ADC1 channel 9 Code: /*Start Conversion */ ADC1_StartConversion(); Cho phép bộ ADC bắt đầu hoạt động Trong file stm8s_it.c : Thực hiện edit code như sau : Code: extern uint16_t Conversion_Value; Khai... biến Conversion_Value, và xóa cờ ngắt Sau khi thực hiện các đoạn code trên chúng ta lưu lại và tiến hành dịch chương trình, nạp vào kit STM8S_Discovery để tiến hành debug,để có thể debug các bạn có thể làm 1 module nhỏ thay đổi được giá trị điện áp và kết nối nó vào kit Sau đó cho chương trình chạy và debug . thử ứng dụng Bước đầu làm quen với STM8 - ADC + Interrupt Chào các bạn ! Hôm nay Ano xin trở lại series hướng dẫn các bạn tiếp cận dòng vi điều khiển STM8 của hãng ST với bài viết về ADC. ADC. series này: • UART. • Ngắt • Timer. • ADC. Bước đầu làm quen với STM8 - Creating Project GPIO Chào các bạn . Hy vọng các bạn đều thành công với bài viết trước của mình. Hôm nay, bài viết tiếp theo. tới file stm8s_gpio.h của thư viện GPIO trong thư mục project_template, cụ thể đường dẫn như sau: Desktopdemo_gpioLibrariesSTM8S_StdPeriph_Drive rincstm8s_gpio.h click vào chọn file stm8s_gpio.h

Ngày đăng: 04/09/2014, 20:22

TỪ KHÓA LIÊN QUAN

w