Mục tiêu nghiên cứu
• Mục tiêu của bộ sản phẩm
- Sử dụng dùng để thông báo thời gian
- Người sử dụng có thể cài đặt thời gian báo theo mong muốn
Kết quả đạt được
- Có thể sử dụng thay thế cho việc đánh trống báo giời học cở các trường học và làm chuông báo thức
CƠ SỞ LÝ THUYẾT
Phân tích đề tài
Nhóm em thiết kế hệ thống chuông báo giờ tự động sử dụng bộ vi xử lý SMT32F407 Discovery kết hợp với modul thời gian thực DS1307 để hiển thị thời gian trên LCD 16x2 Hệ thống sẽ có 4 nút điều chỉnh: Nút 1 (mode) để chuyển đổi vùng cài đặt, Nút 2 (ok) để lưu thông tin, Nút 3 (up) để tăng số đếm, và Nút 4 (down) để giảm số đếm Khi relay nhận tín hiệu mức 1, chuông báo sẽ reo liên tục trong 5 giây và sau đó ngắt Người dùng có thể cài đặt thời gian dựa trên lịch học của trường trong phần cài đặt.
Lựa chọn thiết bị phần cứng
- Với đề tài mạch chuông báo giờ nhóm em đã lựa chọn những thiết bị phần cứng phù hợp với mạch:
2.2.1.Vi xử lí: STM32F407 Discovery
- Kit phát triển STM32F407 Discovery được thiết kế với các phần thí nghiệm cơ bản:
Cổng USB, đèn LED, nút bấm và bộ nhớ Flash ngoài là những tính năng nổi bật của kit, bên cạnh đó còn tích hợp cổng nạp chuẩn Jtag, cổng UART, NRF24L01 và LCD, giúp mở rộng khả năng thực hiện nhiều thí nghiệm khác nhau, rất phù hợp cho những ai mới bắt đầu tìm hiểu về STM32.
• Nguồn sử dụng: 5VDC từ cổng USB hoặc chân GPIO
• Thiết kế ra chân GPIO đầy đủ
• Tích hợp bộ nhớ Flash
• Tích hợp cổng nạp chuẩn Jtag
• Tích hợp khe cắm mạch RF NRF24L01+, UART, LCD,
• Bộ vi điều khiển STM32F407 Discovery có 32-bit Arm ® Cortex ® -M4 với lõi FPU, bộ nhớ Flash 1-Mbyte và RAM 192-Kbyte trong gói LQFP100
Hình 2.2: STM32F407 Discovery ARM Cortex-M3
- Chuông điện 3inch nhà thờ, trường học, nhà xưởng villa báo động 220V 60dB
• Chuông điện 220V là chuông dùng trực tiếp nguồn điện
Hình 2.3: Chuông điện 6 inch 12VDC - 220V- Đường kính 15cm
Module DS1307 (RTC) là một trong những module đồng hồ thời gian thực (RTC) phổ biến và giá cả phải chăng Nó có khả năng theo dõi chính xác thời gian, bao gồm giây, phút, giờ, ngày, tháng và năm.
- Một số tính năng quan trọng của DS1307 là:
• Khả năng tạo sóng vuông có thể lập trình
• Cơ số mặc định là BCD
• Dòng điện thấp, dưới 500mA trong chế độ sao lưu pin
• Khả năng thiết lập ngày đến năm 2100
• Sử dụng chuẩn giao tiếp I2C
• Các thành phần cần thiết như thạch anh 32768kHz, điện trở pull-up và tụ lọc nguồn đều được tích hợp trên board
• 5-pin bao gồm giao thức I2C sẵn sàng giao tiếp: INT (QWO), SCL, SDA, VCC và GND
• Điện áp làm việc: 3.3V đến 5V
- Module DS1307 sử dụng pin CR2023 3 volt Bộ nhớ EEPROM 24c32 nhúng trên mô-đun này có thể tiết kiệm 32kb dữ liệu
- Ngoài ra, các bạn có thể đo nhiệt độ môi trường bằng cách sử dụng cảm biến
DS18B20 đã được tích hợp sẵn trên board mạch
- Đọc giá trị điện áp của pin từ chân BAT
• GND: Nối vào cực âm của mạch
• SCL: Nối Vào chân SCL của STM32F407
• SDA: Nối Vào chân SDA của STM32F407
Chuông điện hoạt động với nguồn điện 220V AC, do đó cần sử dụng một relay để kết nối với dây GND của chuông Khi relay ở trạng thái 0 (không nhận tín hiệu từ vi điều khiển), chuông sẽ không hoạt động.
8 điện không hoạt động, khi relay ở mức 1(có tín hiệu từ vi điều khiển 3,3V) thì chuông điện hoạt động do chân COM và chân NO được nối với nhau
• Ba lỗ để bắt vít cố định có đường kính 3.1mm
• Opto cách ly quang, chống nhiễu
• Có đèn báo đóng ngắt trên Relay
• Điện áp sử dụng: 5VDC
• Đầu ra điện thê đóng ngắt tối đa: DC 30V / 10A, AC 250V / 10A
LCD 16x2 (Liquid Crystal Display) là một thành phần quan trọng trong nhiều ứng dụng của Vi Điều Khiển nhờ vào những ưu điểm vượt trội như khả năng hiển thị đa dạng ký tự, bao gồm chữ, số và ký tự đồ họa Thiết bị này dễ dàng tích hợp vào các mạch ứng dụng thông qua nhiều giao thức giao tiếp khác nhau, đồng thời tiêu tốn ít tài nguyên hệ thống và có giá thành phải chăng Vì vậy, việc sử dụng LCD 16x2 là lựa chọn hợp lý cho các dự án yêu cầu hiển thị thông tin một cách hiệu quả.
1 hàng để hiển thị thứ/ ngày và 1 hàng để thể hiện giờ, vì vậy nhóm em đã chọn màn hình LCD 16x2
• Hiển thị tối đa 16 tự trên 2 dòng
• Chữ đen nền xanh lá
Chức năng các chân của LCD:
+ Chân 1: (Vss) Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
GND của mạch điều khiển
+ Chân 2: VDD Là chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với VCC = 5V của mạch điều khiển
+ Chân 3: V0 là chân điều chỉnh độ tương phản của LCD
+ Chân 4: RS Là chân chọn thanh ghi (Register select) Nối chân RS với logic
“0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi:
- Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
“ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
- Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD
Pin 5, known as R/W, is used to select the read/write mode for the LCD Connect the R/W pin to logic "0" to enable write mode, or connect it to logic "1" to switch to read mode.
+ Chân 6: E Là chân cho phép (Enable) Sau khi các tín hiệu được đặt lên bus
DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E
Khi ở chế độ ghi, dữ liệu trên bus sẽ được chuyển vào thanh ghi nội bộ của LCD khi phát hiện một xung chuyển tiếp từ cao xuống thấp của tín hiệu chân.
Khi ở chế độ đọc, dữ liệu sẽ được LCD xuất ra các chân DB0-DB7 khi phát hiện sự chuyển đổi từ mức thấp sang mức cao (low-to-high transition) tại chân E, và dữ liệu này sẽ được giữ trên bus cho đến khi chân E trở về mức thấp.
+ Chân 7 - 14: DB0 - DB7 - Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU Có 2 chế độ sử dụng 8 đường bus này:
- Chế độ 8 bit: Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7
- Chế độ 4 bit: Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7
+ Chân 15: Nguồn dương cho đèn nền
+ Chân 16: GND cho đèn nền
Hình 2.6: LCD 16x2(Liquid Crystal Display)
• Loại: Điện trở cố định
Điện trở 4.7K Ohm là loại điện trở kim loại film cacbon, với các vạch màu trên thân thể hiện trị số theo quy ước toàn cầu Đây là linh kiện điện tử thụ động, có công suất 1/4W, chuyên dùng để cản trở dòng điện với dung sai chỉ +/-5% Kích thước của điện trở này rất nhỏ, dài 6.5mm, rộng 2mm và chân cắm 0.5mm, phù hợp với nhiều ứng dụng trong mạch điện Nhiệt độ hoạt động của điện trở này cũng rất đa dạng.
55 o C đến 155 o C và dải điện áp rộng thích hợp với nhiều mạch điện tử
Nút nhấn nhả R13-507 16mm màu xanh là thiết bị điện có chức năng nhấn xuống để đóng mạch và tự động trở về trạng thái hở mạch khi thả tay Sản phẩm này rất phù hợp cho các ứng dụng như mô hình, đồ án, chế tạo và trong ngành công nghiệp.
• Kích thước khoan lỗ lắp đặt : 16mm
• Nút bền, độ nhạy, độ nảy tốt
• Có sẵn đai ốc siết chặt
Biến trở là một điện trở ba cực với tiếp điểm trượt hoặc xoay, hoạt động như một bộ chia điện áp chỉnh được Khi chỉ sử dụng hai đầu ra, nó trở thành điện trở thay đổi hoặc biến trở Dụng cụ đo gọi là chiết áp thực chất là bộ chia điện áp dùng để đo điện thế Chiết áp thường được sử dụng để điều khiển các thiết bị điện, như âm lượng trên thiết bị âm thanh Khi thanh trượt được vận hành bởi cơ chế xác định, nó có thể làm đầu dò vị trí, ví dụ trong joystick Tuy nhiên, chiết áp hiếm khi được dùng để điều khiển công suất lớn hơn một watt, vì công suất tiêu tán trong chiết áp sẽ tương đương với công suất tải điều khiển.
Phần mềm hỗ trợ lập trình
STM32CubeMX là công cụ lý tưởng để cấu hình và tạo mã cho MCU STM32, giúp lập trình viên thực hiện các công việc cấu hình và nâng cấp thông qua giao diện đồ họa Điều này không chỉ đơn giản hóa quá trình lập trình trên STM32 mà còn tiết kiệm thời gian nghiên cứu và phát triển.
Hình 2.7: Phần mềm STM32CubeMX
Hiện nay, có nhiều trình biên dịch ngôn ngữ C cho 8051 như Mikro C, LAR, SDCC, và Reads 51 Trong số đó, Vision của công ty Keil Software, thường được gọi là Keil C, là một môi trường phát triển tích hợp (IDE) mạnh mẽ và phổ biến Keil C hỗ trợ lập trình cho các chip vi điều khiển 8051 và ARM từ tất cả các hãng trên thế giới.
Hình 2.8: Phần mềm KeilC Version 5
Sơ đồ nguyên lý của hệ thống
2.4.1.Khối thời gian thực DS1307 (RTC)
- Chân SDA và SCL của DS1307 đc nối với chân SDA và SCL của SMT32F407 (khi cài đặt I2C trên STM32F407 sẽ xuất hiện chân SDA và SCL)
- Chân SDA và SCL được nối với điện trở 4.7kΩ, 2 con điện trở sẽ được nối với nguồn 5VAC
- DS1307 sẽ giúp hiển thị thời gian thực chính xác khi được kết nối qua vi điều khiển để xuất tín hiệu lên LCD để hiển thị thời gian
- Khối điều khiển bao gồm 4 nút nhấn, mỗi nút nhấn có các chức năng khác nhau:
• Nút 1( Mode): Được nối với điện trở 4.7kΩvà nguồn 5VAC Nối với chấn PA9 của vi điều khiển để xuất tín hiệu
• Nút 2( Ok): Được nối với điện trở 4.7kΩvà nguồn 5VAC Nối với chấn PA10 của vi điều khiển để xuất tín hiệu
• Nút 3( Up): Được nối với điện trở 4.7kΩvà nguồn 5VAC Nối với chấn PA11 của vi điều khiển để xuất tín hiệu
• Nút 4( Down): Được nối với điện trở 4.7kΩvà nguồn 5VAC Nối với chấn PA12 của vi điều khiển để xuất tín hiệu
Hình 2.11: Khối vi xửa lý
Khối vi xử lý nhận mã lập trình từ Keil C và xử lý các tín hiệu đầu vào từ các nút (nút 1, nút 2, nút 3, nút 4) cùng với DS1307 để xuất tín hiệu ra màn hình LCD và relay.
Nhiệm vụ của hệ thống là nhận tín hiệu từ vi điều khiển và hiển thị trên màn hình LCD Biến trở có chức năng điều chỉnh độ sáng của LCD, giúp người dùng dễ dàng quan sát các thông số hiển thị một cách rõ ràng.
Relay nhận tín hiệu từ vi điều khiển để thay đổi trạng thái thường mở và thường đóng Khi nhận tín hiệu thường mở, relay sẽ đóng lại dòng điện 220V AC, cho phép chuông phát tín hiệu.
Sơ đồ nguyên lý
Hình 2.14: Sơ đồ nguyên lý
THIẾT KẾ
Kết nối phần cứng
- Dựa vào sơ đồ nguyên lý nhóm em có thống kê về các I/O ngõ vào và ngõ ra của vi xửa lý:
+ SAD và SCL là ngõ vào của DS1307 nối với chân PB6(SCL) và PB7(SDA) của vi xử lý
+ Input: Nút 1, nút 2, nút 3 và nút 4 được nối lần lượt với PA9(Mode), PA10(Ok), PA13(Up) và PA14(Down) của vi xử lý
+ Chân RS, E, D4, D5, D6, D7 của LCD được nối lần lượt với chân PE0, PE1, PE2, PE3, PE4, PE5 của vi xử lý
+ Output: Chân IN của relay được nối vào chân PB1 của vi xử lý.
Sơ đồ giải thuật
Hình 3.1: Sơ đồ giả thuật
Phương trình giải thuật
Hình 3.2: Phương trình giải thuật.
Code cho hệ thống
This article discusses the initialization of variables for a real-time clock application in C programming It defines a 16-bit variable for GPIO pin configuration and several 8-bit variables to store time components such as hours, minutes, seconds, day, month, and year Additionally, it includes arrays for time data and send data, along with character arrays for LCD display The code also initializes various flags and counters for alarm settings, allowing for multiple alarm configurations and user interactions.
I2C_HandleTypeDef hi2c1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); uint8_t BCD2DEC (uint8_t data)
} uint8_t DEC2BCD(uint8_t data)
MX_I2C1_Init(); lcd_init (); lcd_puts (0,0,(int8_t*)datalcd); sendData[0]2BCD (00); sendData[1]2BCD (57); sendData[2]2BCD (6); sendData[3]2BCD (1); sendData[4]2BCD (26); sendData[5]2BCD (12); sendData[6]2BCD (21);
HAL_I2C_Mem_Write_IT(&hi2c1, 0x68) { phutbaothuc1 ; if(phutbaothuc1 ==0) { phutbaothuc1 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
////// if (chapnhan ==2) { sprintf (datalcd , "sbaothuc1:%02d :", giaybaothuc1 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
} if(j>) { giaybaothuc1 ; if(giaybaothuc1 ==0) { giaybaothuc1 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
//////cai gio và phut bao thuc 2//////////////////////////////////////////////////////////////////// if (chapnhan ==3)
{ sprintf (datalcd , "hbaothuc2:%02d :", giobaothuc2 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
} if(j>) { giobaothuc2 ++; if(giobaothuc2 >23) { giobaothuc2 =0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
{ sprintf (datalcd , "pbaothuc2:%02d :", phutbaothuc2 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
} if(j>) { phutbaothuc2 ++; if(phutbaothuc2 >59) { phutbaothuc2=0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
} if(j>) { phutbaothuc2 ; if(phutbaothuc2 ==0) { phutbaothuc2 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
} if(j>) { giaybaothuc2 ++; if(giaybaothuc2 >59) { giaybaothuc2=0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
} if(j>) { giaybaothuc2 ; if(giaybaothuc2 ==0) { giaybaothuc2 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
28 while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
///////cai gio phut bao thuc 3/////////////////////////////////////////////////////////////////// if (chapnhan ==6)
{ sprintf (datalcd , "hbaothuc3:%02d :", giobaothuc3 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
} if(j>) { giobaothuc3 ++; if(giobaothuc3 >23) { giobaothuc3 =0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
29 while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
} if(j>) { giobaothuc3 ; if(giobaothuc3 ==0) { giobaothuc3 #;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
{ sprintf (datalcd , "pbaothuc3:%02d :", phutbaothuc3 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
} if(j>) { phutbaothuc3 ; if(phutbaothuc3 ==0) { phutbaothuc3 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
} } } ////// if (chapnhan ==8) { sprintf (datalcd , "sbaothuc3:%02d :", giaybaothuc3 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0) {
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) {
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) {
} } } /////////cai gio va phut bao thuc 4///////////////////////////////////////////////////////////////// if (chapnhan ==9) { sprintf (datalcd , "hbaothuc4:%02d :", giobaothuc4 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0)
} if(j>) { giobaothuc4 ; if(giobaothuc4 ==0) { giobaothuc4 #;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0)
} } } if (chapnhan =) { sprintf (datalcd , "pbaothuc4:%02d :", phutbaothuc4 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
} if(j>) { phutbaothuc4 ++; if(phutbaothuc4 >59) { phutbaothuc4 =0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0)
} if(j>) { phutbaothuc4 ; if(phutbaothuc4 ==0) { phutbaothuc4 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0)
{ sprintf (datalcd , "sbaothuc4:%02d :", giaybaothuc4 ); lcd_puts (0,0,(int8_t*) datalcd);
// nut up if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
{ while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_13)==0)
} if(j>) { giaybaothuc4 ++; if(giaybaothuc4 >59) { giaybaothuc4 =0;
// nut down if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_14)==0)
} if(j>) { giaybaothuc4 ; if(giaybaothuc4 ==0) { giaybaothuc4 Y;
// nut ok if (HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0) { while(HAL_GPIO_ReadPin( GPIOA,GPIO_PIN_10)==0)
} void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
If the instance of hi2c matches hi2c1, the variables giay, phut, gio, thu, ngay, thang, and nam are assigned values by converting the corresponding elements of timedata from BCD to decimal format using the BCD2DEC function.
/** Configure the main internal regulator output voltage
HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLT AGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
/** Initializes the CPU, AHB and APB buses clocks
RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) ! HAL_OK)
*/ static void MX_I2C1_Init(void)
The I2C1 initialization code configures the hi2c1 instance with a clock speed of 400 kHz, a duty cycle of 2, and sets the addressing mode to 7-bit It disables dual address mode and general call mode, while ensuring no stretch mode is applied The initialization process is completed by calling HAL_I2C_Init, which returns an error status if the setup is unsuccessful.
*/ static void MX_GPIO_Init(void)
HAL_RCC_GPIOE_CLK_ENABLE();
HAL_RCC_GPIOH_CLK_ENABLE();
HAL_RCC_GPIOB_CLK_ENABLE();
HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pins : PE2 PE3 PE4 PE5
GPIO_InitStruct.Pin GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : PA9 PA10 PA13 PA14 */
GPIO_InitStruct.Pin GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
* @brief This function is executed in case of error occurrence
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
/* USER CODE END Error_Handler_Debug */
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred
* @param file: pointer to the source file name
* @param line: assert_param error line source number
*/ void assert_failed(uint8_t *file, uint32_t line)
/* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Thử nghiệm trên mô hình
Hình 3.3: Kết nối mô phỏng phần cứng
Kết quả thử nghiệm
Hình 3.4: Bảng kết quả thí nghiệm