BÁO CÁO THỰC TẬP TÌM HIỂU VỀ STM32F103 I Tổng quan II Nội dung thực hiện 1 UART 2 GPIO 3 Ngắt ngoài trên STM32F103 4 STM32 đọc ADC một kênh 5 Giao thức I2C, STM32 với module RTC DS3231 6 SPI stm32 và[.]
BÁO CÁO THỰC TẬP TÌM HIỂU VỀ STM32F103 I Tổng quan II Nội dung thực UART GPIO Ngắt STM32F103 STM32 đọc ADC kênh Giao thức I2C, STM32 với module RTC DS3231 SPI stm32 arduino UART STM32 1.1 Khung truyền liệu khái niệm quan trọng Idle frame: Đường truyền UART mức “1”, để xác nhận đường truyền liệu trống, khơng có frame truyền Break frame: Đường truyền UART mức “0”, để xác nhận đường truyền truyền liệu, có frame truyền Data hay liệu thông tin mà nhận trình truyền nhận Data STM32 có quy định khung truyền 8bit 9bit Trong q trình truyền UART, bit có trọng số thấp (LSB – least significant bit) truyền trước cuối bit có ảnh hưởng cao (MSB – most significant bit) Parity bit dùng để kiểm tra liệu truyền có hay khơng Có loại Parity Parity chẵn (even parity) parity lẽ (odd parity) Parity chẵn nghĩa số bit trong data truyền với bit Parity số chẵn, ngược lại Parity lẽ nghĩa số bit 1 data truyền với bit Parity số lẻ Stop bits bit báo cáo truyền/nhận biết gói liệu gởi xong Stop bits bit bắt buộc phải có khung truyền Stop bits 1bit, 1.5bit, 2bit, 0.5bit 1.2 Một số ghi sử dụng UART a USART_SR – Status register TXE : bit báo có data truyền hay khơng, = 0_data rỗng, => truyền, = data truyền RXNE: bit báo data nhận hay chưa =1: nhận, =0 chưa nhận nhận chưa xong TC : cờ báo nhận data data vừa truyền xong b USART_DR – Data register Thanh ghi chứa Data nhận Data truyền gồm bit Và phụ thuộc vào trạng thái truyền nhận định data truyền data nhận c USART_BRR – Baud rate register Thanh ghi chứa giá trị tốc độ baudrate cài đặt DIV_Mantissa[11:0] thành phần trước dấu “,” DIV_Freaction[3:0] thành phần sau dấu phẩy tốc độ baud d USART_CRx – Control register UE: bit cho phép UART hoạt động M: độ dài data hay bit WAKE: phương pháp đáng thức UART Idle line Address Mask PCE : cho phép không cho phép parity PS: chọn loại Parity chẵn lẻ PEIE: cho phép ngắt PE hay không ngắt TXEIE: cho phép ngắt truyền hay không TCIE: cho phép ngắt truyền/nhận xong hay không RXNEIE: cho phép ngắt nhận hay không TE: cho phép truyền hay không RE: cho phép nhận hay không RWU : cho phép thức tỉnh hay không nhận dc data từ bên e USART_GTPR – Guard time and prescaler register 1.3 Chương trình mơ Khởi tạo Buffer để truyền nhận liệu biến nhận Rx data biến lưu giá trị trỏ ghi vào Rx Buffer Cờ báo nhận thành công để gửi TX Nếu u8_RxData nhận khác kí tự Enter (giá trị 13 bảng ASCII), ghi giá trị u8_RxData vào u8_RxBuf sau tăng giá trị _RxIndex Nếu RxData kí tự Enter, xóa biến _RxIndex bật cờ Tx Ex_2: uint8_t rx_data; // Nhận data uint8_t tx_data[20] = “STM32 Hello Man!!\r\n”;// Chứa liệu cần truyền HAL_UART_Transmit(&huart1,tx_data(uint8_t *pData), sizeof(tx_data), uint32_t Timeout);// => Hàm truyền DL có sẵn thư viện HAL // tx_data(uint8_t *pData): Mảng/chuỗi ký tự dùng để truyền // sizeof(tx_data): Số lượng kí tự truyền // uint32_t Timeout: Thời gian sử dụng cho việc truyền liệu // VD: HAL_UART_Transmit(&huart1, (uint8_t*)str, 14,100); HAL_UART_Receive_IT(&huart1, &rx_data, 1);// => Hàm nhận data sử dụng ngắt // &huart1: Sử dụng UART1 VĐK // (uint8_t*) rx_data: Truyền vào địa mảng Rx_data để nhận liệu, (uint8_t *) dùng để ép kiểu liệu // Size = 1: Số kí tự nhận vào xảy ngắt void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance == UART1){} } // Hàm ngắt nhận liệu UART STM32F103C8T6 có đến UART nên hàm ngắt cần kiểm tra liệu nhận từ UART GPIO STM32 Chức GPIO STM32 bao gồm: INPUT Pull up: Đầu vào có điện trở kéo lên (Điện áp mặc định Vcc) Pull down: Đầu vào có điện trở kéo xuống(Điện áp mặc định 0V) Input floating: Điện áp không cố định dao động từ 0V đến Vcc(No pull up and no pull down) Analog: Đầu vào tương tự, dùng để đo ADC OUTPUT Output push Pull: Đầu dạng đẩy kéo, tín hiệu có Vcc 0V tương ứng với Bit ghi vào chân #include "main.h" uint8_t status; // Khai báo biến để lưu trạng thái nút nhấn while(1){ status = HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin); // Hàm đọc giá trị nút nhấn HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, status); // Hiển thị kết từ giá trị nhận từ nút nhấn } // Đọc giá trị nút nhấn ON bật ghi giá trị lên LED if(HAL_GPIO_ReadPin(GPIOA, ON_Pin)== GPIO_PIN_RESET){ HAL_GPIO_WritePin(GPIOC, LED_Pin, GPIO_PIN_RESET); } // Đọc giá trị nút nhấn OFF bật ghi giá trị lên LED if(HAL_GPIO_ReadPin(GPIOA, OFF_Pin)== GPIO_PIN_RESET){ HAL_GPIO_WritePin(GPIOC, LED_Pin, GPIO_PIN_SET); } PIN_SET PIN_RESET: Xuất tín hiệu mức “1” “0” // Hàm đảo trạng thái Led hàm đợi viết vòng lặp while(1) HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); Ngắt ngồi STM32F103 a Quy trình thực q trình ngắt ngồi - EXTI(External Interupts): Xảy có kiện bên ngồi tác động vào chân EXTI - Ngắt ngồi STM32 mơ tả sau: + Kích hoạt độc lập dịng ngắt (Line Interrupts) + Truy cập đến Bit dòng ngắt + Tạo tối đa 20 kiện/ngắt - Khối External Interrupt bao gồm 23 phát sườn để tạo yêu cầu ngắt, người sử dụng có thể cấu hình lựa chọn sườn ngắt (sườn lên, sườn xuống 2) để kích hoạt ngắt Mỗi line ngắt cấu hình cho phép tạo u cầu ngắt không cách độc lập - Để tạo ngắt, line ngắt cần cấu hình chọn sườn ngắt thông qua hai ghi Rising trigger selection (nếu muốn chọn sườn lên làm tín hiệu kích hoạt ngắt) và Falling trigger slection (nếu muốn chọn sườn xuống làm tín hiệu kích hoạt ngắt), sau cách set bit tương ứng line ngắt ghi Interrupt Mask để cho phép tạo yêu cầu ngắt - Khi có thay đổi sườn tín hiệu tương ứng xảy line cấu hình ngắt yêu cầu ngắt (Interrupt Request) tạo Lúc bit tương ứng với line ngắt ghi Pending Request được set lên yêu cầu ngắt khối NVIC chấp nhận thực thi b Một số ghi sử dụng cho ngắt - FTSR: Falling trigger selection register (EXT_FTSR), FTSR có 32 bit, sử dụng 16 bit thấp để cấu hình chọn sườn xuống cho line ngắt tương ứng với chân GPIO - RTSR: Rising trigger selection register (EXT_RTSR), RTSR có 32 bit, sử dụng 16 bit thấp để cấu hình chọn sườn lên cho line ngắt tương ứng với chân GPIO => Nếu cấu hình chọn sườn lên sườn xuống cho line yêu cầu ngắt tạo trường hợp xuất sườn lên sườn xuống - Thanh ghi cho phép ngắt: Interrupt mask Register - Thanh ghi chờ phục vụ ngắt: Pending register(PR) => Có hai loại ưu tiên ngắt khác MCU STM32F103C8T6 Preemption Priorities Sub Priorities: – Mặc định ngắt có Preemtion Priority cao thực trước – Khi ngắt có mức Preemption Priority ngắt có Sub Priority cao ngắt thực trước – Cịn trường hợp ngắt có mức Preemption Sub Priority ln ngắt đến trước thực trước c Thực hành HAL_NVIC_Setpriority(x,y,z): x_ thông số EXTI Line Interrupt, y_mức độ ưu tiên preempriority, z_mức độ ưu tiên subpriority STM32 đọc ADC kênh ADC Analog to Digital Convert chuyển đôi tương tự sang số Đại lượng tương tự Điện áp Vin so sánh với điện áp mẫu Vref (giá trị lớn nhất), sau chuyển đổi thành số lưu vào ghi DATA chuyển đổi Có tham số quan trọng ADC: Tốc độ lấy mẫu (sampling) tính theo số chu kì chuyển đổi Độ phân giải: Tính theo Bit ADC có độ phân giải n Bit có 2^n giá trị 4.1 Chế độ Single uint16_t ADCVal; // Khởi tạo biến 16 bit lưu giá trị trả chuyển đổi float Voltage; While(1) { HAL_ADC_Start(&hadc1); // Hàm kich hoat bo chuyen doi ADC1 khong lien tuc gọi liên tiếp cần sử dụng HAL_Delay(50); var = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); } // Vì chế độ single chế độ đọc lần ta phải liên tục gọi hàm Start cần dùng đến 4.2 Chế độ Continuous MX_ADC1_Init(); // Hàm khởi tạo ADC1 hadc1.Init.ContinuousConvMode=ENABLE;// Kích hoạt ADC liên tục HAL_ADC_Start(&hadc1);// Khởi tạo lần, nằm while() sử dụng ADC liên tục ... Status register TXE : bit báo có data truyền hay khơng, = 0_data rỗng, => truyền, = data truyền RXNE: bit báo data nhận hay chưa =1: nhận, =0 chưa nhận nhận chưa xong TC : cờ báo nhận data data vừa... khác MCU STM32F103C8T6 Preemption Priorities Sub Priorities: – Mặc định ngắt có Preemtion Priority cao thực trước – Khi ngắt có mức Preemption Priority ngắt có Sub Priority cao ngắt thực trước... vòng lặp while(1) HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); Ngắt ngồi STM32F103 a Quy trình thực q trình ngắt ngồi - EXTI(External Interupts): Xảy có kiện bên tác động vào chân