1. Nội dung thiết kế tốt nghiệp:
3.6 Sơ đồ nguyên lý
Hình 3. 15 Sơ đồ nguyên lý mạch thiết kế
Đồ Án Tốt Nghiệp
Trang 43
Chương 4: Thiết kế phần mềm 4.1 Tổng quan lập trình cho STM32
4.1.1 Các thiết bị ngoại vi của VĐK
a) Sơ đồ khối VĐK STM32
Hình 4. 1 Sơ đồ khối vi điều khiển STM32F103RC [5]
Hệ thống nhúng ARM cung cấp một phần lớn hơn của dòng chảy dữ liệu bên trong lõi CPU bằng cách truyền dữ liệu nén ở một tỷ lệ rất cao từ STM32F103 thông qua một số lượng nhỏ của các chân ETM để phần cứng bên ngoài cổng thiết
Trang 44
bị (TPA) phân tích. TPA được kết nối với một máy chủ bằng cách sử dụng USB, Ethernet, hoặc bất kỳ kênh tốc độ cao khác.
Hướng thời gian thực và hoạt động của lưu lượng dữ liệu có thể được ghi lại và sau đó định dạng hiển thị trên máy chủ chạy phần mềm chương trình gỡ rối.
b) Ánh xạ bộ nhớ các thiết bị ngoại vi VĐK
Đồ Án Tốt Nghiệp
Trang 45
Bộ nhớ được chia ra làm 8 block mỗi block có dung lượng là 512M byte được đánh địa chỉ từ 0x0000 0000 đến 0xFFFF FFFF.
c) Bộ công cụ hỗ trợ phần mềm dành cho STM32
Vì Keil ARM sử dụng Libraries rời cho dòng STM32 nên khi tạo một Project mới ta phải đính kèm Libraries cho dự án. Thực chất ta hoàn toàn có thể để Libraries ở nơi nào đó tùy thích,việc quan trọng là ta phải thêm đúng đường dẫn đến thư viện trong phần Setup lúc biên dịch là được.
Còn thêm 2 file mà chúng ta nên quan tâm nữa đó là stm32f10x_conf.h và system_stm32f10x.c. 2 file này tốt nhất nên được lưu cùng folder với file main.c để tiện cho việc tìm kiếm.
ST cung cấp cho người dùng bộ thư viện chuẩn lập trình giao tiếp với thiết bị ngoại vi tương thích với chuẩn CMSIS. Thông qua bộ thư viện này, chúng ta dễ dàng giao tiếp với các thiết bị phần cứng chuẩn của các dòng Cortex-M3 của ST.
Thư viện được chia làm 2 phần:
Phần hỗ trợ nhân Cortex-M3: bao gồm mã giao tiếp với nhân CPU, và đoạn mã start up code.
Phần hỗ trợ các thiết bị ngoại vi: chứa toàn bộ các hàm thư viện điều khiển thiết bị ngoại vi của ST.
Cấu trúc thư viện CMSIS như sau:
Library + CMSIS + CM3
+ CoreSupport //thư mục chứa hàm hỗ trợ nhân Cortex-M3 + DeviceSupport
+ ST
+ STM32F10X //System startup code + startup //Start up code
+ Documentation //tài liệu hỗ trợ
+ STM32F10x_StdPeriph_Driver //thư mục chứa hàm hỗ trợ thiết bị ngoại vi
+ inc //thư mục chứa header file + src //thư mục chứa mã nguồn
4.1.2 Công cụ phần mềm biên dịch, gỡ lỗi nạp chương trình của STM32
Trang 46
Hình 4. 3 Phần mềm lập trình keil ARM
Phần mềm keil ARM hỗ trợ hỗ trợ rất nhiều hàm giao tiếp ngoại vi:
Nhóm“CMSIS”:thêm flie core_cm3.c ở thư mục
“Libraries\CMSIS\CM3\CoreSupport” và system_stm32f10x.c ở thư mục “\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”.
Nhóm “StdPeriph_Driver”: thêm các file liên quan đến điều khiển ngoại vi.
Nhóm“Start up”: thêm file startup_stm32f10x_hd.s ở thư mục “Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”
Nhóm “User”: chứa file của người dùng. b)Công cụ biên soạn Source Insight
Để hỗ trợ việc soạn thảo, viết chương trình được thuận tiện thì có một công cụ rất hữu ích, đã và đang được các lập trình viên trên thế giới sử dụng rộng rãi (IBM, Intel…) đó là Source Insight.
Đồ Án Tốt Nghiệp
Trang 47
Việc biên soạn chương trình trên Keil (hoặc đa phần các công cụ lập trình khác như IAR, CodeRed…) rất bất tiện:
• Các tính năng tìm kiếm thường rất hạn chế (tính năng tìm kiếm nhanh, dễ dàng theo dõi các hàm, biến… trong một chương trình gồm rất nhiều tập tin *.c & *.h là rất cần thiết).
• Giao diện soạn thảo đơn điệu (màu sắc của các từ khóa, biến toàn cục, cục bộ …).
Công cụ Source Insight khắc phục rất tốt 2 nhược điểm nêu trên. Với khả năng tìm kiếm, liệt kê kết quả tìm được và giao diện soạn thảo ưa nhìn với nhiều cách chú thích code, giúp người lập trình dễ theo dõi chương trình.
4.2 Thiết kế cấu trúc chung chương trình
Trình lưu đồ thuật toán chung. Bắt đầu Khởi động USART1,USART2 Cấu hình Real Time Khởi động SD Card
Gửi câu lệnh cấu hình Module Sim Nhập thông số từ cột xăng Cột ID: Số Lít: Thành Tiền: Có nhập nữa không?
Cấu hình thời gian nhận từ SĐT Admin đến SĐT nhận tin nhắn Chạy bộ đếm thời gian thực Thời gian thực = Thời gian nhận tin nhắn Gửi câu lệnh AT gửi tin nhắn Kết thúc Lưu thông tin vào thẻ nhớ
Trang 48
4.2.1 Khai báo các hàm giao tiếp RS232, RS485
VoidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);
Đây là hàm kích hoạt xung nhịp cho thiết bị ngoại vi.
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
Đây là khởi tạo cấu hình cho cổng GPIO theo cấu hình được lưu trong cấu trúc GPIO_InitTypeDef.
voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef* USART_InitStruct);
Hàm này khởi tạo cấu hình cho cổng USART.
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
Hàm này cho phép hoặc không thiết bị ngoại vi giao tiếp USART hoạt động.
4.2.2 Khai báo các hàm điều khiển module sim
Void AT_Configuration();
Hàm cấu hình các câu lệnh mặc định gửi tới Module Sim.
Void AT_Send_SMS();
Hàm này có chức năng gửi câu lệnh AT+CMGS để gửi tin nhắn đến số điện thoại nhận.
4.2.3 Khai báo các hàm đọc ghi thẻ nhớ
MSD_SPI_Configuration();
void MSD_SPI_Configuration(void); void MSD_SPIHighSpeed(uint8_t b_high); _card_disable();
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
Đây là hàm khởi tạo cấu hình các chân cho thẻ nhớ SDCard.
f_mount(0,&fs);
res = f_open( &fsrc , "0:/DemoDoAn.TXT" , FA_CREATE_NEW); res = f_open( &fsrc , "0:/DemoDoAn.TXT" , FA_WRITE);
res = f_write(&fsrc, text1, sizeof(text1), &br);
Trên là các hàm ghi dữ liệu vào thẻ nhớ đã được tạo sẵn 1 file .txt ,ở đây là file DemoDoAn.TXT.
4.3 Triển khai các hàm chương trình
4.3.1 Giao tiếp RS232, RS485
Giao tiếp kết nối bên ngoài với một thiết bị khác bằng ba chân. Bất kỳ giao tiếp USART hai chiều đòi hỏi phải có tối thiểu hai chân: Nhận dữ liệu vào (RX) và Truyền dữ liệu ra (TX):
Đồ Án Tốt Nghiệp
Trang 49
RX: Tiếp nhận dữ liệu ngõ vào là dữ liệu nối tiếp. Kỹ thuật lấy mẫu được sử dụng cho dữ liệu thu hồi để chọn lọc giữa các dữ liệu đến hợp lệ đến và nhiễu.
TX: Truyền dữ liệu ngõ ra. Khi bộ phát bị vô hiệu hóa, các chân ngõ ra trở về cấu hình cổng I/O. Khi bộ phát được kích hoạt và không có gì được truyền đi, các TX pin ở mức cao. Trong chế độ single-wire và Smartcard, các I/O này được sử dụng để truyền và nhận được dữ liệu (tại USART, dữ liệu này sau đó nhận được trên SW_RX).
Mô tả ký tự USART:
Chiều dài Word có thể được lựa chọn là 8 hoặc 9 bit bằng cách lập trình các bit M trong thanh ghi USART_CR1.Các chân TX ở trạng thái thấp trong khi bit Start. Nó ở trạng thái cao trong khi bit Stop.
Một Ký tự rỗi được hiểu như là một bộ khung toàn các sô "1" tiếp theo sau bit Start – tiếp theo bit Start là khung dữ liệu - (Các số "1" sẽ bao gồm cả bit Stop).
Một Ký tự ngừng được hiểu về việc tiếp nhận các số "0 " trong một thời gian của khung dữ liệu. Vào cuối khung ngừng được truyền chèn 1 hoặc 2 bit Stop (bit "1") để xác nhận bit Start. Truyền và nhận được điều khiển bởi một bộ phát tốc độ baud, xung clock cho mỗi ký tự được tạo ra khi bit cho phép được thiết lập tương ứng cho truyền phát và nhận.
Hình 4. 5 Độ dài Word lập trình[17] Transmitter:
Bộ phát có thể gửi word dữ liệu 8 hay 9 bit tùy thuộc vào trạng thái bit M. Khi truyền tải bit cho phép (TE) được thiết lập, các dữ liệu trong các thanh ghi dịch truyền tải đưa ra trên chân TX và xung đồng hồ tương ứng được đưa ra trên chân SCLK.
Ký tự truyền:
Trong một bộ truyền USART, dữ liệu dịch ra ít nhất là bit có ý nghĩa đầu tiên trên chân TX. Trong chế độ này, các thanh ghi USART_DR bao gồm một bộ đệm (TDR) giữa bus nội bộ và thanh ghi truyền.
Mỗi ký tự được ưu tiên bởi một bit Start có mức logic thấp trong chu kỳ bit. Các ký tự được kết thúc bằng cấu hình của các bit Stop.
Trang 50
Lưu ý:
Các bit TE không nên được reset trong quá trình truyền dữ liệu. Reset các bit TE trong khi truyền dẫn sẽ bị hỏng dữ liệu trên các chân TX cũng như các như bộ đếm tốc độ baud. Các dữ liệu hiện tại đang được truyền đi sẽ bị mất.
Một khung rỗi sẽ được gửi sau khi bit TE được kích hoạt.
Cấu hình bit Stop: Số bit Stop được truyền đi với mỗi ký tự có thể được lập trình trong thanh ghi điều khiển 2, bit 13,12.
1 bit Stop: Đây là giá trị mặc định của số bit Stop.
2 bit Stop: Hỗ trợ cho USART thông thường, chế độ single-wire và modem.
0.5 bit Stop: Được sử dụng khi nhận được dữ liệu trong chế độ SmartCard.
1.5 bit Stop: Được sử dụng khi truyền dữ liệu trong chế độ SmartCard.
Hình 4. 6 Cấu hình các bit Stop [17]
Các thủ tục phát của USART:
Bật USART bằng cách ghi bit UE trong thanh ghi USART_CR1 lên “1”.
Lập trình bit M trong USART_CR1 để xác định độ dài từ.
Lập trình số bit Stop ở thanh ghi USART_CR2.
Chọn DMA cho phép (DMAT) trong USART_CR3 nếu bộ đệm đa
truyền thông còn trống. Cấu hình thanh ghi DMA như được giải thích trong giao tiếp multibuffer.
Thiết lập các bit TE ở USART_CR1 để gửi một khung rỗi với lần truyền đầu tiên.
Chọn tốc độ truyền mong muốn bằng cách sử dụng thanh ghi USART_BRR.
Đồ Án Tốt Nghiệp
Trang 51
Ghi dữ liệu để gửi vào thanh ghi USART_DR (điều này sẽ xóa sạch các bit TXE). Lặp lại cho mỗi dữ liệu được truyền đi trong trường hợp có một bộ đệm duy nhất.
Receiver:
Các USART có thể nhận được word dữ liệu 8 hay 9 bit tùy thuộc vào các bit M trong thanh ghi USART_CR1.
Phát hiện bit Start:
Trong USART, các bit Start được phát hiện khi một trình tự cụ thể của mẫu được công nhận.
Trình tự này là: 1 1 1 0 X 0 X 0X 0X 0 X 0X 0
Hình 4. 7 Phát hiện bit Start [17] Lưu ý:
Nếu trình tự này không hoàn chỉnh, các bit Start phát hiện hủy bỏ và bộ nhận trả về trạng thái rỗi (cờ không được set) chờ cạnh xuống.
Nếu chỉ có 2 trong 3 bit ở mức 0 (lấy mẫu bit thứ 3, 5 và 7 hoặc lấy mẫu vào bit thứ 8, 9 và 10), các bit Start được xác nhận nhưng bit cờ nhiễu NE được set. Các bit Start được xác nhận nếu 3 mẫu cuối cùng là ở mức 0 (lấy mẫu bit thứ 8, 9, và 10 bit).
Ký tự tiếp nhận:
Trong một bộ nhận USART, dữ liệu dịch ít nhất là bit đầu tiên có nghĩa qua chân RX. Trong chế độ này, thanh ghi USART_DR bao gồm một bộ đệm (RDR) giữa bus nội bộ và thanh ghi dịch nhận.
Các thủ tục nhận của USART:
Trang 52
Lập trình bit M trong USART_CR1 để xác định độ dài từ.
Lập trình số bit Stop ở USART_CR2.
Chọn DMA cho phép (DMAR) trong USART_CR3 nếu bộ đệm đa
truyền thông còn trống. Cấu hình thanh ghi DMA như được giải thích trong giao tiếp multibuffer.
Chọn tốc độ truyền mong muốn bằng cách sử dụng thanh ghi tốc độ baud USART_BRR.
Thiết lập bit RE trong thanh ghi USART_CR1. Cho phép bộ nhận bắt đầu tìm kiếm một bit Start.
Chương trình test USART1:
int main(void) {
USART_Configuration();
printf("**************************************************************\r\n"); printf("* *\r\n"); printf("* TEST USART1 *\r\n"); printf("* *\r\n"); printf("**************************************************************\r\n"); printf("Cau Hinh Cau Lenh Gui Xuong Tram Xang:\r\n");
/* Infinite loop */ while (1){
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){;} /* Store the received byte in RxBuffer */
RxBuffer[RxCounter] = (USART_ReceiveData(USART1) & 0x7F); if(RxBuffer[RxCounter]==0x0A)
{
printf("Cau Lenh la: "); temp=RxCounter;
for(RxCounter=1;RxCounter<temp;RxCounter++) {
USART_SendData(USART1,RxBuffer[RxCounter]);
Đồ Án Tốt Nghiệp
Trang 53
}
printf("\r\n");
printf("Cau Lenh Khac:\r\n"); RxCounter=0;
}
RxCounter++; }
}
4.3.2 Câu lệnh AT điều khiển Module Sim900
Các lệnh AT là các hướng dẫn được sử dụng để điều khiển một modem. AT là một cách viết gọn của chữ Attention. Mỗi dòng lệnh của nó bắt đầu với “AT” hay “at”. Đó là lí do tại sao các lệnh Modem được gọi là các lệnh AT. Nhiều lệnh của nó được sử dụng để điều khiển các modem quay số sử dụng dây mối (wired dial-up modems), chẳng hạn như ATD (Dial), ATA (Answer), ATH (Hool control) và ATO (return to online data state), cũng được hỗ trợ bởi các modem GSM/GPRS và các điện thoại di động.
Bên cạch bộ lệnh AT thông dụng này, các modem GSM/GPRS và các điện thoại di động còn được hỗ trợ bởi một bộ lệnh AT đặc biệt đối với công nghệ GSM. Nó bao gồm các lệnh liên quan tới SMS như AT+ CMGS (gửi tin nhắn SMS), AT+CMSS (gửi tin nhắn SMS từ một vùng lư trữ), AT+CMGL (chuỗi liệt kê các tin nhắn SMS) và AT+CMGR (đọc tin nhắn SMS).
Chú ý là khởi động “AT” là một tiền tố để thông báo tới modem về sự bắt đầu của một dòng lệnh. Nó không phải là một phần của tên lệnh AT. Ví dụ như D là một tên lệnh AT thực tế trong ATD và +CMGS là tên một lệnh AT thực tế trong AT+CMGS. Tuy nhiên, một số sách hay một số trang web lại sử dụng chúng thay cho nhau như là tên của một lệnh AT.
Sau đây là một vài nhiệm vụ có thể được hoàn thành bằng cách sử dụng các lệnh AT kết hợp với sử dụng 1 modem GSM/GPRS hay một điện thoại di động:
Lấy thông tin cơ bản về điện thoại di động hay modem GSM/GPRS. Ví dụ như tên của nhà sản xuất (AT+CGMI), số model (AT+CGMM), số IMEI (International Mobile Equipment Identity) (AT+CGSN) và phiên bản phần mềm (AT+CGMR).
Lấy thông tin trạng thái hiện tại của điện thoại di động hay modem GSM/GPRS. Ví dụ như trạng thái hoạt động của điện thoại (AT+CPAS), trạng thái đăng kí mạng mobile (AT+CREG), chiều dài sóng radio (AT+CSQ), mức sạc bin và trạng thái sạc bin (AT+CBC).
Thiết lập một kết nối dữ liệu hay kết nối voice tới một remote điều khiển (ATD, ATA,..)
Trang 54
Gửi và nhận fax (ATD, ATA,AT+F*)
Gửi (AT+CMGS, AT+CMSS), đọc (AT+CMGR, AT+CMGL), viết (AT+CMGW) hay xóa tin nhắn SMS (AT+CMGD) và nhận các thông báo của các tin nhắn SMS nhận được mới nhất (AT+CNMI).
Đọc (AT+CPBR), viết (AT+CPBW) hay tìm kiếm (AT+CPBF) cá mục về danh bạ điện thoại (phonebook).
Thực thi các nhiệm vụ liên quan tới an toàn, chẳng hạn như mở hay đóng các khóa chức năng (AT+CLCK), kiểm tra xem một chức năng được khóa hay chưa (AT+CLCK) và thay đổi password (AT+CPWD).
Điều khiển hoạt động của các mã kết quả/các thông báo lỗi của các lệnh AT. Ví dụ, bạn có thể điều khiển cho phép hay không cho phép kích hoạt hiển thị thông báo lỗi (AT+CMEE) và các thông báo lỗi nên được hiển thị theo dạng số hay theo dạng dòng chữ (AT+CMEE=1 hay AT+CMEE=2).
Thiết lập hay thay đổi cấu hình của điện thoại di dộng hay modem
GSM/GPRS. Ví dụ, thay đổi mạng GSM (AT+COPS), loại dịch vụ của bộ truyền tin (AT+CBST), các thông số protocol liên kết với radio
(AT+CRLP), địa chỉ trung tâm SMS (AT+CSCA) và khu vực lưu trữ các tin nhắn SMS (AT+CPMS).
Lưu và phục hồi các cấu hình của điện thoại di động hay modem
GSM/GPRS. Ví du, lưu (AT+COPS) và phục hồi (AT+CRES) các thiết lập liên quan tới tin nhắn SMS chẳng hạn như địa chỉ trung tâm tin nhắn SMS. Chú ý là nhà sản xuất điện thoại di động thường không thi hành tất cả các lệnh AT, các thông số lệnh và các giá trị của tham số trong các điện thoại di động. Trạng thái hành vi của các lệnh AT thực thi có thể cũng khác so với các định nghĩa chuẩn trước đó. Nói chung, các modem GSM/GPRS được thiết kế dành cho các ứng dụng wireless mà có được các hỗ trợ tốt về các lệnh AT hơn là các điện thoại di động thông thừơng khác.
Thêm vào đó, một vài lệnh AT yêu cầu sự hỗ trợ từ các tổng đài của mạng di động. Ví dụ, SMS thông qua GPRS có thể được kích hoạt trên các điện thoại di động có sử dụng GPRS và các modem GPRS với lệnh +CGSMS (tên lệnh ở dạng text: Select Service for MO SMS Messages). Nhưng nếu tổng đài mạng điện thoại không hỗ trợ quá trình truyền dẫn SMS thông qua GPRS, thì bạn không thể sử dụng chức năng này được.
Cách gửi câu lệnh và nhận trả lời
Đồ Án Tốt Nghiệp
Trang 55
Hình 4. 8 Thiết lập cấu hình mặc định [17] (1) ATZ<CR>
Reset modem,kiểm tra modem đã hoạt động bình thường chưa. Gửi nhiều lần cho chắc ăn, cho đến khi nhận được chuỗi ATZ<CR><CR><LF>OK<CR><LF>