Код: Выделить всё
/* Include my libraries here */
#include "defines.h"
#include "main.h"
#include "tm_stm32f4_ili9341.h"
#include "stdlib.h"
#include <string.h>
#include <stdio.h>
#define ADC_CDR_ADDRESS ((uint32_t)0x40012308)
TM_RTC_Time_t datatIme;
char irtc [32];
char adc_1 [8];
char adc_2 [8];
char vbat [8];
char string [256];
char usart_rx [128];
char rx_str [128];
//---------------------test---------------------------//
#define MAX_STRLEN 128 // this is the maximum string length of our string in characters
char received_string_usrt6[MAX_STRLEN+1]; // this will hold the recieved string
char received_string_usrt3[MAX_STRLEN+1]; // this will hold the recieved string
char received_string_usrt1[MAX_STRLEN+1]; // this will hold the recieved string
u32 StringLen = 0;
u32 StringRdy = 0;
//---------------------test---------------------------//
char vbat_str [6];
char adc1_str [6];
char adc2_str [4];
int i_vbat;
int i_adc1;
int i_adc2;
uint8_t c;
long double result_vbat;
long double result_adc1;
long double result_adc2;
//---------------------test---------------------------//
void TM_USART6_ReceiveHandler(uint8_t c){
if ((c != '\r') && (StringLen < MAX_STRLEN))
{
received_string_usrt6[StringLen++] = c;
TM_GPIO_TogglePinValue(GPIOD, GPIO_Pin_14);
TM_DISCO_LedOn(LED_RED);
}
else
{
if (StringLen < MAX_STRLEN)
{
// save LF as well
received_string_usrt6[StringLen++] = c;
}
received_string_usrt6[StringLen] = 0;
StringRdy = 1;
StringLen = 0;
}
if(StringRdy){
TM_USART_Puts(USART6,received_string_usrt6);
TM_USART_Puts(USART6, "\n\r");
TM_USART_Puts(USART1,received_string_usrt6);
TM_USART_Puts(USART1, "\n\r");
StringRdy = 0;
memset(received_string_usrt6, 0, sizeof(received_string_usrt6));
}
}
void TM_USART3_ReceiveHandler(uint8_t c){
if ((c != '\r') && (StringLen < MAX_STRLEN))
{
received_string_usrt3[StringLen++] = c;
TM_GPIO_TogglePinValue(GPIOD, GPIO_Pin_12);
}
else
{
if (StringLen < MAX_STRLEN)
{
// save LF as well
received_string_usrt3[StringLen++] = c;
}
received_string_usrt3[StringLen] = 0;
StringRdy = 1;
StringLen = 0;
}
if(StringRdy){
// TM_USART_Puts(USART3,received_string_usrt3);
// TM_USART_Puts(USART3, "\n\r");
TM_USART_Puts(USART1,received_string_usrt3);
TM_USART_Puts(USART1, "\n\r");
StringRdy = 0;
memset(received_string_usrt3, 0, sizeof(received_string_usrt3));
}
}
void TM_USART1_ReceiveHandler(uint8_t c){
if ((c != '\r') && (StringLen < MAX_STRLEN))
{
received_string_usrt1[StringLen++] = c;
TM_GPIO_TogglePinValue(GPIOD, GPIO_Pin_10);
}
else
{
if (StringLen < MAX_STRLEN)
{
// save LF as well
received_string_usrt1[StringLen++] = c;
}
received_string_usrt1[StringLen] = 0;
StringRdy = 1;
StringLen = 0;
}
if (c == '\r')
{
if(strcmp(received_string_usrt1,"status\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?S\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}
else if(strcmp(received_string_usrt1,"sound\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?CA\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}
else if(strcmp(received_string_usrt1,"local\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?BL\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}
else if(strcmp(received_string_usrt1,"remote\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?BR\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"rssi\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?E\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"signal\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?I\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"time\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?T\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"speed\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?V\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"battery\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?BV\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"counter\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART3, "+++AT?ZE\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else if(strcmp(received_string_usrt1,"help\r")==0){
TM_USART_Puts(USART1,"received:");
TM_USART_Puts(USART1, "1)status\n\r2)sound\n\r3)local\n\r4)remote\n\r5)rssi\n\r6)signal\n\r7)time\n\r8)speed\n\r9)battery\n\r10)counter\n\r");
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}else{
// TM_USART_Puts(USART1,received_string_usrt1);
TM_USART_Puts(USART3,received_string_usrt1);
TM_USART_Puts(USART3, "\n");
StringRdy = 0;
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}if(StringRdy){
TM_USART_Puts(USART3,received_string_usrt1);
TM_USART_Puts(USART3, "\n\r");
// TM_USART_Puts(USART1,received_string_usrt1);
// TM_USART_Puts(USART1, "\n\r");
StringRdy = 0;
if(f_printf(&fl,received_string_usrt1) == FR_OK){
f_sync(&fl);
}
memset(received_string_usrt1, 0, sizeof(received_string_usrt1));
}
}
}
int main(void) {
/* Initialize system */
SystemInit();
//Initiaize button
TM_DISCO_ButtonInit();
//Initialize Leds
TM_DISCO_LedInit();
/* Initialize Delay library */
TM_DELAY_Init();
// init_timer_data();
GPIO_Init_Leds();
/* Initialize USART3, 19200baud PB10 PB11 */
TM_USART_Init(USART3, TM_USART_PinsPack_1, 19200);
TM_USART_Puts(USART3, "STARTED USART3!!!\n\r");
/* Initialize USART6, 115200baud PC6 PC7*/
// TM_USART_Init(USART6, TM_USART_PinsPack_1, 19200);
// TM_USART_Puts(USART6, "STARTED USART6!!!\n\r");
/* Initialize USART1, 19200baud PA2 PA3*/
TM_USART_Init(USART1, TM_USART_PinsPack_1, 19200);
TM_USART_Puts(USART1, "STARTED USART1!!!\n\r");
TM_RTC_Interrupts(TM_RTC_Int_1s);
while (1) {
if(TM_DISCO_ButtonPressed()){
f_close(&fl);
f_mount(0, "", 1);
TM_ILI9341_Puts(10, 120, "USB flash drive is removed successfully" , &TM_Font_7x10, ILI9341_COLOR_ORANGE, 0x0000);
}else{}
/* Read ADC1 Channel0 Read ADC1 Channel3 */
snprintf(adc_1 ,sizeof(adc_1) , "%4d" , TM_ADC_Read(ADC1, ADC_Channel_8));
snprintf(adc_2 ,sizeof(adc_2) , "%4d" , TM_ADC_Read(ADC1, ADC_Channel_9));
/* Read & format data */
snprintf(vbat, sizeof(vbat) , "%4d" , TM_ADC_ReadVbat(ADC1));
snprintf(string,sizeof(string),"|%s|-|%s-%s-%s|\n\r",irtc, vbat_str, adc1_str, adc2_str);
TM_ILI9341_Puts(75 , 60, vbat_str ,&TM_Font_7x10, ILI9341_COLOR_WHITE , 0x0000);
TM_ILI9341_Puts(75 , 30, adc1_str ,&TM_Font_7x10, ILI9341_COLOR_WHITE , 0x0000);
TM_ILI9341_Puts(75 , 45, adc2_str ,&TM_Font_7x10, ILI9341_COLOR_WHITE , 0x0000);
TM_ILI9341_Puts(10 , 15, irtc ,&TM_Font_7x10, ILI9341_COLOR_WHITE , 0x0000);
i_vbat = atoi(vbat);
result_vbat = ((3.14 / 4096) * i_vbat)+ 0.6;
sprintf(vbat_str, "%.2Lf", result_vbat);
i_adc1 = atoi(adc_1);
result_adc1 = ((3.14 / 4096) * i_adc1)+ 0.3;
sprintf(adc1_str, "%.2Lf", result_adc1);
i_adc2 = atoi(adc_2);
result_adc2 = ((3.14 / 4096) * i_adc2);
sprintf(adc2_str, "%.2Lf", result_adc2);
f_printf(&fl,string);
f_sync(&fl);
/* Little delay */
Delayms(100);
}
}
Собственно вот кусочек кода, самое основное я выкладываю, библиотеками пользуюсь отсюда - http://stm32f4-discovery.com/2014/04/library-04-connect-stm32f429-discovery-to-computer-with-usart/ Что очень упростило разработку в целом, 2 порта стабильно работают, третий порт, он же шестой усарт, показывает, что работает, но прерывание у него не срабатывает, данные не синхронно поступают. То есть по факту один порт отладки(условно), второй порт - передача данных, третий порт - управление через Wi-fi(usart-модуль). Ссылка на библиотеки есть, попробую оттестить каждый порт по одному, для проверки их на работоспособность, но почему-то меня терзают смутные сомнения, ибо из 8-ми усартов работает только два.......Странно это очень. За код не ругайте, сам знаю, что это полный колхоз. Комменты поставил осознанно, по причине того, что порт тупо висит и я его не инициализирую пока....Может кто попробует запустить 3 порта и 3 прерывания на них...было бы интересно узнать, работает ли оно так вообще. Заранее спасибо