1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Thí nghiệm vi xử lí vi điều khiển

21 6 0

Đ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 21
Dung lượng 3,13 MB

Nội dung

Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển Thí nghiệm vi xử lí vi điều khiển

Mục llụ ục Giới thiệu STM32F103 IDE: 1.1Giới thiệu vi điều khiển STM32F103: 1.2 Giới thiệu ST-Link V2 Keil uVision 5: 1.3 Tạo project mới: 1.4 Build project: 1.5 Nạp code: Nội dung thực hành: 2.1 STM32F103 GPIO:  GPIO Output Mode:  LED Circuit:  Code thực hiện: 2.2 GPIO Read Button:  GPIO Input Mode:  Button Circuit:  Code thực hiện: 2.3 STM32F103 System Timer: 11  Code thực hiện: 11 2.4 Giao tiếp LCD: 13  Code thực hiện: 14 2.5 Giao tiếp SPI: 15  Code thực hiện: 17 Thí nghiệm Vi xử lí - Vi điều khiển BÁO CÁO THÍ NGHIỆM VI XỬ LÝ – VI ĐIỀU KHIỂN Giới thiệu STM32F103 IDE: 1.1Giới thiệu vi điều khiển STM32F103: STM32F103 mô t vi điều khiển 32 bit hãng STMicroelectronics, dựa xử lý ARM Cortex-M3 Tốc độ xung nhịp xử lý lên tới 72 MHz Nó có 64Kbytes cua bơ  nhơ flash 20 Kbytes SRAM Có vai bảng phát triển cho vi điều khiển có sẵn thị trường Trong hướng dẫn này, ta sử dụng bảng phát triển Nó có 40 chân phù hợp với bo test mach  Nó có ADCs 12bit, timers lên đến giao diện truyền thông (3 USART, I2C, SPI, CAN, USB) 1.2 Giới thiệu ST-Link V2 Keil uVision 5:  p trinh mạch cho họ vi ST-Link v2 mô t trình sưa lơi thiê t bi lâ điều khiển STM8 STM32 Có loại ST-Link, phiên gốc phiên la i Đối với IDE, ta sử dụng Keil uVision5 Phiên đánh giá Keil uVision5 có giới hạn mã 32 Kbytes, với mục đích học tập đủ Sau đo , ba n phai tai cac MDK5 Software Packs ( cac thư viên ) cho vi điê u khiê n nay ơ 1.3 Tạo project mới: -Trước tạo Project Keil, bạn phải cài đặt Software Packs Ta cài đặt cách nhấp vào biểu tượng Pack Installer cơng cụ Thí nghiệm Vi xử lí - Vi điều khiển Trong hộp thoại Pack Installer, chọn menu File → Import, chọn Software Pack (the pack file) -Để tạo Project mới, chọn Project → New uVision Project, đặt tên cho project sau chọn vi điều khiển bạn (STM32F103C8) Sau đó, bạn chọn thư viện ngoại vi tương ứng ma bạn muốn sử dụng, sau nhấp vào nút Resolve Thí nghiệm Vi xử lí - Vi điều khiển 1.4 Build project: Trong cửa sổ Project, bạn đổi tên thư mục Target Source Group thành STM32F103C8 Source tương ứng Nhấp chuột phải vào thư mục Source, sau nhấp vào Add New Item to Group Chọn tệp c đặt tên cho tệp (ví dụ: main.c) Bạn viết mã bạn tập tin main.c Bạn Build Project cách nhấp vào biểu tượng Build từ công cụ nhấn F7 Built Output bạn nên không chứa lỗi 1.5 Nạp code: Sau Build Project thành cơng, bạn tải mã vào vi điều khiển Để làm điều đó, cần định cấu hình cài đặt ST-Link cách nhấp vào biê u tươ ng Options for Target Trong tab Debug, chọn Trình gỡ lỗi ST-Link nhấp vào nút Settings Đặt thuộc tính hộp thoại Cortex-M Target Driver Setup sau: Thí nghiệm Vi xử lí - Vi điều khiển Kiểm tra tùy chọn Reset and Run, vi điều khiển chạy chương trình sau trình nạp code kết thúc Nếu bạn khơng chọn tùy chọn này, bạn phải nhấn nút đặt lại để chạy chương trình Nội dung thực hành: 2.1 STM32F103 GPIO: STM32F103 GPIO chân cấu hình làm đầu vào đầu Trong hướng dẫn này, ta se giai thich lam thê nao đê sư dung  GPIO STM32F103 để điều khiển bật / tắt đèn LED STM32F103 GPIO cấu hình chế độ khác (chế độ đầu vào, chế độ đầu ra, chế độ đầu vào tương tự chế độ chưc luân phiên) Để điều khiển bật / tắt đèn LED, ta cần định cấu hình chân GPIO chế độ đầu  GPIO Output Mode: Có chế độ đầu cho GPIO, đầu Open Drain đâ u Push - pull Điện áp logic STM32F103 GPIO 3,3V, điện áp đầu pin 3,3V Đây đặc điểm pin GPIO cấu hình chế độ Output: Thí nghiệm Vi xử lí - Vi điều khiển  LED Circuit: Cấu hình LED hoạt động tích cực mức thấp Khi PA0 mức thấp hay mức “0”, đèn LED bật Khi PA0 mức cao hay mức “1”, đèn LED tắt Chế độ đầu mà ta sử dụng chế độ Output Push-Pull, vậy, ta gán vào ghi liệu đầu ra, N-MOS bật, đèn LED bật (dịng điện chảy từ Vdd sang Vss qua LED điện trở) Khi ta gán “1” vào ghi liệu đầu ra, P-MOS bật, đèn LED tắt (dịng điện khơng thể chảy từ Vdd sang Vdd) Thí nghiệm Vi xử lí - Vi điều khiển  Code thực hiện: #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" void delay(unsigned int nCount); GPIO_InitTypeDef GPIO_InitStruct; int main (void) { // Enable clock for GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Configure PA0 as push-pull output GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { /* Toggle LED on PA0 */ // Reset bit will turn on LED (because the logic is inverted) GPIO_ResetBits(GPIOA, GPIO_Pin_0); delay(1000); // Set bit will turn off LED (because the logic is inverted) GPIO_SetBits(GPIOA, GPIO_Pin_0); delay(1000); } } // Delay function void delay(unsigned int nCount) { unsigned int i, j; for (i = 0; i < nCount; i++) for (j = 0; j < 0x2AFF; j++); } Thí nghiệm Vi xử lí - Vi điều khiển 2.2 GPIO Read Button:  GPIO Input Mode: STM32F103 GPIO có chế độ đầu vào digital: đầu vào với kéo lên, đầu vào với kéo xuống, đầu vào floating Điện áp logic STM32 3,3V, điện áp logic cho chân đầu vào GPIO 3,3V, có số chân có khả chịu 5V Ta sử dụng mức logic 5V cho chân đầu vào chịu 5V Bảng cho thấy mức điện áp I/O chân đầu vào STM32F103 Đặc tính chân GPIO cấu hình chế độ đầu vào hiển thị hình bên Thí nghiệm Vi xử lí - Vi điều khiển  Button Circuit: Ta thêm đèn LED mạch để hiển thị trạng thái nút (được nhấn hay không) Đối với chế độ đầu vào GPIO, ta sử dụng chế độ đầu vào pull up, trước mạch hoạt động mức thấp (khi nhấn nút, logic ghi liệu đầu vào “0”) Chế độ đầu GPIO cho đèn LED chế độ open drain hoạt động mức thấp  Code thực hiện: #include "stm32f10x.h" Thí nghiệm Vi xử lí - Vi điều khiển #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" GPIO_InitTypeDef GPIO_InitStruct; int main(void) { // Enable clock for GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Cofigure PA0 as open-drain output GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOA, &GPIO_InitStruct); // Cofigure PA1 as input with internal pull-up resistor GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { // If button on PA1 is pressed (button circuit is active low) if (!(GPIO_ReadInputData(GPIOA) & GPIO_Pin_1)) { // Turn on LED on PA0 (LED circuit is active low) GPIO_ResetBits(GPIOA, GPIO_Pin_0); } else { // Turn off LED on PA0 GPIO_SetBits(GPIOA, GPIO_Pin_0); } } } 10 Thí nghiệm Vi xử lí - Vi điều khiển 2.3 STM32F103 System Timer:  STM32F103 System Timer hay SysTick định thời bên CPU Trong SysTick đếm ngược Để dùng SysTick, ta cần nạp giá trị vào ghi giá trị nạp, ghi có độ rộng 24 bit nên đếm từ 0x00FFFFFF Trong lab ta tạo hàm delay micro giây mili giây  Code thực hiện:  File main.c: #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "delay.h" void delay(unsigned int nCount); 11 Thí nghiệm Vi xử lí - Vi điều khiển GPIO_InitTypeDef GPIO_InitStruct; int main (void) { // Enable clock for GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Configure PA0 as push-pull output GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { /* Toggle LED on PA0 */ // Reset bit will turn on LED (because the logic is interved) GPIO_ResetBits(GPIOA, GPIO_Pin_0); DelayMs(1000); // Set bit will turn off LED (because the logic is interved) GPIO_SetBits(GPIOA, GPIO_Pin_0); DelayMs(1000); } }  File delay.h: #ifndef DELAY_H #define DELAY_H #ifdef cplusplus extern "C" { #endif #include "stm32f10x.h" void DelayInit(void); void DelayUs(uint32_t us); void DelayMs(uint32_t ms); #ifdef cplusplus } #endif #endif  File delay.c: #include "delay.h" 12 Thí nghiệm Vi xử lí - Vi điều khiển // For store tick counts in us static IO uint32_t usTicks; // SysTick_Handler function will be called every us void SysTick_Handler() { if (usTicks != 0) { usTicks ; } } void DelayInit() { // Update SystemCoreClock value SystemCoreClockUpdate(); // Configure the SysTick timer to overflow every us SysTick_Config(SystemCoreClock / 1000000); } void DelayUs(uint32_t us) { // Reload us value usTicks = us; // Wait until usTick reach zero while (usTicks); } void DelayMs(uint32_t ms) { // Wait until ms reach zero while (ms ) { // Delay 1ms DelayUs(1000); } } 2.4 Giao tiếp LCD:  LCD16x2 module hiển thị phổ biến thường sử dụng thiết bị khác Để liên kết LCD với STM32F103, ta cần tập tin thư viện (lcd16x2.h lcd16x2.c) Trong thư viện này, chúng tơi định cấu hình GPIO cho LCD tệp lcd16x2.h Trong lcd16x2.h chứa cấu hình GPIO cho 13 Thí nghiệm Vi xử lí - Vi điều khiển LCD Bạn cấu hình GPIO cho dịng điều khiển LCD (RS, RW, EN) dòng liệu LCD (D4 - D7) Thư viện hỗ trợ Chế độ liệu bit #ifndef LCD16X2_H #define LCD16X2_H #ifdef cplusplus extern "C" { #endif /** Includes */ #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "delay.h" /** Port and pin definition for 4-bit mode */ // LCD control lines (must be on the same port) #define LCD16X2_RCC_GPIO_CONTROL RCC_APB2Periph_GPIOB #define LCD16X2_GPIO_CONTROL GPIOB #define LCD16X2_GPIO_RS GPIOB #define LCD16X2_GPIO_RW GPIOB #define LCD16X2_GPIO_EN GPIOB // LCD data lines (must be on the same port) #define LCD16X2_RCC_GPIO_DATA RCC_APB2Periph_GPIOA #define LCD16X2_GPIO_DATA GPIOA #define LCD16X2_GPIO_D4 GPIOA #define LCD16X2_GPIO_D5 GPIOA #define LCD16X2_GPIO_D6 GPIOA #define LCD16X2_GPIO_D7 GPIOA // Pin definition #define LCD16X2_PIN_RS GPIO_Pin_12 #define LCD16X2_PIN_RW GPIO_Pin_13 #define LCD16X2_PIN_EN GPIO_Pin_14 #define LCD16X2_PIN_D4 GPIO_Pin_8 // 4-bit mode LSB #define LCD16X2_PIN_D5 GPIO_Pin_9 #define LCD16X2_PIN_D6 GPIO_Pin_10 #define LCD16X2_PIN_D7 GPIO_Pin_11 // 4-bit mode MSB  Code thực hiện: 14 Thí nghiệm Vi xử lí - Vi điều khiển  File main.c #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "delay.h" #include "lcd16x2.h" // Custom char data (battery symbol) uint8_t custom_char[] = { 0x0E, 0x1B, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x1F }; int main(void) { // Delay initialization DelayInit(); // LCD initialization lcd16x2_init(LCD16X2_DISPLAY_ON_CURSOR_OFF_BLINK_OFF); // Create custom char lcd16x2_create_custom_char(0, custom_char); while (1) { lcd16x2_put_custom_char(0, 0, 0); lcd16x2_puts(" pin yeu "); } 2.5 Giao tiếp SPI: STM32F103 SPI (Giao diện ngoại vi nối tiếp) giao thức giao tiếp nối tiếp đồng Trong giao diện này, ngồi việc truyền nhận liệu, cịn có dòng thứ ba sử dụng cho CLOCK Mỗi thiết bị phụ thuộc có pin chọn (cho phép), sử dụng để kích hoạt thiết bị Vì vậy, để sử dụng SPI, cần dây cho dòng liệu (MOSI, MISO), dây cho CLOCK dây cho thiết bị cho chọn chip MOSI (Master Out Slave In) sử dụng để truyền liệu từ thiết bị sang thiết bị phụ MISO (Master In Slave Out) sử dụng để truyền liệu từ thiết bị phụ sang thiết bị chính.Giao tiếp SPI khác với giao tiếp nối tiếp khác, đặc biệt truyền liệu Khơng có khái niệm truyền nhận liệu, có khái niệm giao dịch liệu Khi giao dịch 15 Thí nghiệm Vi xử lí - Vi điều khiển liệu xảy ra, bit liệu ghi giao dịch với bit liệu ghi clock từ thiết bị (một bit liệu clock đánh dấu) Bạn nghĩ SPI giống ghi thay đổi thiết bị thiết bị phụ thuộc Mỗi đầu vào ghi thay đổi kết nối đến đầu khác thông qua dòng MOSI MISO, để chúng tạo thành vịng Thanh ghi chứa liệu 0xFF ghi đích chứa liệu 0x00 Sau clock, cịn lại bảy bit ban đầu bit lấy từ slave ngược lại Sau tổng cộng tám clock, tất tám bit byte giao dịch Đôi tất byte liệu đến từ Slave gửi tới Slave có ý nghĩa Điều xảy có lẽ thiết bị slave chưa nhận lệnh nào, liệu ghi slave khơng có ý nghĩa Một trường hợp khác, muốn lấy liệu từ liệu, không muốn gửi lệnh tới Slave, đặt byte giả ghi sau đưa tám clock để giao 16 Thí nghiệm Vi xử lí - Vi điều khiển dịch với bit liệu ghi slave Hình sơ đồ thời gian giao thức SPI Chúng biết để liên lạc với slave Thiết bị, pin chọn slave kích hoạt (hoạt động thấp) Dữ liệu lấy mẫu xung lên xung clock ta lấy mẫu liệu clock, cài đặt định cấu hình tùy thuộc vào tính SPI phần cứng mà ta sử dụng Thứ tự liệu LSB đầu tiên, MSB tùy thuộc vào cấu hình  Code thực hiện: #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "delay.h" #include "lcd16x2.h" #define SPIx_RCC RCC_APB2PeriphinksI1 17 Thí nghiệm Vi xử lí - Vi điều khiển #define SPIx SPI1 #define SPI_GPIO_RCC RCC_APB2Periph_GPIOA #define SPI_GPIO GPIOA #define SPI_PIN_MOSI GPIO_Pin_7 #define SPI_PIN_MISO GPIO_Pin_6 #define SPI_PIN_SCK GPIO_Pin_5 #define SPI_PIN_SS GPIO_Pin_4 void SPIx_Init(void); uint8_t SPIx_Transfer(uint8_t data); void SPIx_EnableSlave(void); void SPIx_DisableSlave(void); uint8_t receivedByte; int main(void) { DelayInit(); lcd16x2_init(LCD16X2_DISPLAY_ON_CURSOR_OFF_BLINK_OF F); SPIx_Init(); while (1) { // Enable slave SPIx_EnableSlave(); // Write command to slave to turn on LED blinking SPIx_Transfer((uint8_t) '1'); DelayUs(10); // Write command to slave for asking LED blinking status SPIx_Transfer((uint8_t) '?'); DelayUs(10); // Read LED blinking status (off/on) from slave by transmitting // dummy byte receivedByte = SPIx_Transfer(0); // Disable slave SPIx_DisableSlave(); // Display LED blinking status lcd16x2_clrscr(); if (receivedByte == 0) { lcd16x2_puts("LED Blinking Off"); } else if (receivedByte == 1) 18 Thí nghiệm Vi xử lí - Vi điều khiển { lcd16x2_puts("LED Blinking On"); } DelayMs(2500); // Enable slave SPIx_EnableSlave(); // Write command to slave to turn off LED blinking SPIx_Transfer((uint8_t) '0'); DelayUs(10); // Write command to slave for asking LED blinking status SPIx_Transfer((uint8_t) '?'); DelayUs(10); // Read LED blinking status (off/on) from slave by transmitting // dummy byte receivedByte = SPIx_Transfer(0); // Disable slave SPIx_DisableSlave(); // Display LED blinking status lcd16x2_clrscr(); if (receivedByte == 0) { lcd16x2_puts("LED Blinking Off"); } else if (receivedByte == 1) { lcd16x2_puts("LED Blinking On"); } DelayMs(2500); } } void SPIx_Init() { // Initialization struct SPI_InitTypeDef SPI_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; // Step 1: Initialize SPI RCC_APB2PeriphClockCmd(SPIx_RCC, ENABLE); SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; 19 Thí nghiệm Vi xử lí - Vi điều khiển SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set; SPI_Init(SPIx, &SPI_InitStruct); SPI_Cmd(SPIx, ENABLE); // Step 2: Initialize GPIO RCC_APB2PeriphClockCmd(SPI_GPIO_RCC, ENABLE); // GPIO pins for MOSI, MISO, and SCK GPIO_InitStruct.GPIO_Pin = SPI_PIN_MOSI | SPI_PIN_MISO | SPI_PIN_SCK; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPI_GPIO, &GPIO_InitStruct); // GPIO pin for SS GPIO_InitStruct.GPIO_Pin = SPI_PIN_SS; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPI_GPIO, &GPIO_InitStruct); // Disable SPI slave device SPIx_DisableSlave(); } uint8_t SPIx_Transfer(uint8_t data) { // Write data to be transmitted to the SPI data register SPIx->DR = data; // Wait until transmit complete while (!(SPIx->SR & (SPI_I2S_FLAG_TXE))); // Wait until receive complete while (!(SPIx->SR & (SPI_I2S_FLAG_RXNE))); // Wait until SPI is not busy anymore while (SPIx->SR & (SPI_I2S_FLAG_BSY)); // Return received data from SPI data register return SPIx->DR; } void SPIx_EnableSlave() { 20 Thí nghiệm Vi xử lí - Vi điều khiển // Set slave SS pin low SPI_GPIO->BRR = SPI_PIN_SS; } void SPIx_DisableSlave() { // Set slave SS pin high SPI_GPIO->BSRR = SPI_PIN_SS; } 21 Thí nghiệm Vi xử lí - Vi điều khiển ...BÁO CÁO THÍ NGHIỆM VI XỬ LÝ – VI ĐIỀU KHIỂN Giới thiệu STM32F103 IDE: 1.1Giới thiệu vi điều khiển STM32F103: STM32F103 mô t vi điều khiển 32 bit hãng STMicroelectronics, dựa xử lý ARM Cortex-M3... cho project sau chọn vi điều khiển bạn (STM32F103C8) Sau đó, bạn chọn thư vi? ??n ngoại vi tương ứng ma bạn muốn sử dụng, sau nhấp vào nút Resolve Thí nghiệm Vi xử lí - Vi điều khiển 1.4 Build project:... Thí nghiệm Vi xử lí - Vi điều khiển // Set slave SS pin low SPI_GPIO->BRR = SPI_PIN_SS; } void SPIx_DisableSlave() { // Set slave SS pin high SPI_GPIO->BSRR = SPI_PIN_SS; } 21 Thí nghiệm Vi xử

Ngày đăng: 01/04/2022, 00:23

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w