Driver XBEE semble enfin marcher correctement

This commit is contained in:
vezde 2023-04-11 17:14:18 +02:00
parent c6ad9b7094
commit aa83f00d28
15 changed files with 521 additions and 377 deletions

View file

@ -110,15 +110,40 @@
<outputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype.1151842665" name="Resource Custom Build Step Output Type"/>
</tool>
</fileInfo>
<fileInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1504381080.2043503841" name="main.c" rcbsApplicability="disable" resourcePath="Core/Src/main.c" toolsToInvoke="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.346617134">
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.346617134" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646">
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1496459642" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
<fileInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1504381080.1752824616" name="commands.c" rcbsApplicability="disable" resourcePath="Application/commands.c" toolsToInvoke="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.2065737495">
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.2065737495" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1535445780" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1660271606" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
<tool customBuildStep="true" id="org.eclipse.cdt.managedbuilder.ui.rcbs.216781005" name="Resource Custom Build Step">
<inputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.inputtype.2033552080" name="Resource Custom Build Step Input Type">
<additionalInput kind="additionalinputdependency"/>
<tool customBuildStep="true" id="org.eclipse.cdt.managedbuilder.ui.rcbs.1545965840" name="Resource Custom Build Step">
<inputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.inputtype.1314783453" name="Resource Custom Build Step Input Type">
<additionalInput kind="additionalinputdependency" paths=""/>
</inputType>
<outputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype.664489298" name="Resource Custom Build Step Output Type"/>
<outputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype.930101754" name="Resource Custom Build Step Output Type"/>
</tool>
</fileInfo>
<fileInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1504381080.1827743340" name="application.c" rcbsApplicability="disable" resourcePath="Application/application.c" toolsToInvoke="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.2011451410">
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.2011451410" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1397894115" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1629958820" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
<tool customBuildStep="true" id="org.eclipse.cdt.managedbuilder.ui.rcbs.389963892" name="Resource Custom Build Step">
<inputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.inputtype.115340338" name="Resource Custom Build Step Input Type">
<additionalInput kind="additionalinputdependency" paths=""/>
</inputType>
<outputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype.1700687045" name="Resource Custom Build Step Output Type"/>
</tool>
</fileInfo>
<fileInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1504381080.306963435" name="xbee.c" rcbsApplicability="disable" resourcePath="Application/xbee.c" toolsToInvoke="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.277959437">
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646.277959437" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1474341646">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.980636813" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1291936146" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
<tool customBuildStep="true" id="org.eclipse.cdt.managedbuilder.ui.rcbs.1344848918" name="Resource Custom Build Step">
<inputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.inputtype.1895641321" name="Resource Custom Build Step Input Type">
<additionalInput kind="additionalinputdependency" paths=""/>
</inputType>
<outputType id="org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype.840380300" name="Resource Custom Build Step Output Type"/>
</tool>
</fileInfo>
<sourceEntries>

View file

@ -38,6 +38,8 @@ typedef struct {
int32_t motor_right;
char endOfMouvement;
char powerOffRequired;
uint16_t senderAddress;
uint8_t rfProblem;
} APPLICATION_Infos;
@ -83,8 +85,8 @@ void APPLICATION_Init(void) {
/* Init de la partie RF / reception des messages */
XBEE_Init();
BATTERIE_Init();
MOTEURS_Init();
//BATTERIE_Init();
//MOTEURS_Init();
/* Create the task without using any dynamic memory allocation. */
xHandleApplicationMain = xTaskCreateStatic(
@ -112,8 +114,8 @@ void APPLICATION_Init(void) {
void APPLICATION_MainThread(void* params) {
MESSAGE_Typedef msg;
XBEE_INCOMING_FRAME *xbeeFrame;
char *cmd;
CMD_Generic* decodedCmd;
while (1) {
@ -121,54 +123,84 @@ void APPLICATION_MainThread(void* params) {
switch (msg.id) {
case MSG_ID_XBEE_CMD:
cmd = (char*)msg.data;
decodedCmd = cmdDecode(cmd);
// systemInfos.senderAddress = 0x81;
// systemInfos.cmd = 0;
// cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
//
// if (msg.data != NULL)
// free (msg.data);
if (decodedCmd==CMD_DECODE_UNKNOWN)
cmdSendAnswer(ANS_UNKNOWN);
else {
systemInfos.cmd = decodedCmd->type;
systemTimeout.inactivityCnt = 0;
xbeeFrame = (XBEE_INCOMING_FRAME*)msg.data;
/* Manage answer to command, when possible
* (further treatment of the command will be done in APPLICATION_StateMachine) */
switch (decodedCmd->type) {
case CMD_PING:
case CMD_TEST:
case CMD_DEBUG:
case CMD_POWER_OFF:
cmdSendAnswer(ANS_OK);
if (xbeeFrame != NULL) {
systemInfos.senderAddress = xbeeFrame->source_addr;
switch (xbeeFrame->type) {
case XBEE_RX_16BIT_PACKET_TYPE:
decodedCmd = cmdDecode(xbeeFrame->data,xbeeFrame->length);
if (decodedCmd==CMD_DECODE_UNKNOWN)
cmdSendAnswer(systemInfos.senderAddress, ANS_UNKNOWN);
else {
systemInfos.cmd = decodedCmd->type;
systemTimeout.inactivityCnt = 0;
/* Manage answer to command, when possible
* (further treatment of the command will be done in APPLICATION_StateMachine) */
switch (decodedCmd->type) {
case CMD_PING:
case CMD_TEST:
case CMD_DEBUG:
case CMD_POWER_OFF:
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
break;
case CMD_GET_BATTERY:
cmdSendBatteryLevel(systemInfos.senderAddress, systemInfos.batteryVoltage);
break;
case CMD_GET_VERSION:
cmdSendVersion(SYSTEM_VERSION);
break;
case CMD_GET_BUSY_STATE:
if (systemInfos.state == stateInMouvement)
cmdSendBusyState(systemInfos.senderAddress, 0x1);
else
cmdSendBusyState(systemInfos.senderAddress, 0x0);
break;
case CMD_MOVE:
systemInfos.distance = ((CMD_Move*)decodedCmd)->distance;
break;
case CMD_TURN:
systemInfos.turns = ((CMD_Turn*)decodedCmd)->turns;
break;
default:
/* All others commands must be processed in state machine
* in order to find what action to do and what answer to give
*/
break;
}
free(decodedCmd);
}
break;
case CMD_GET_BATTERY:
cmdSendBatteryLevel(systemInfos.batteryVoltage);
break;
case CMD_GET_VERSION:
cmdSendVersion(SYSTEM_VERSION);
break;
case CMD_GET_BUSY_STATE:
if (systemInfos.state == stateInMouvement)
cmdSendBusyState(0x1);
else
cmdSendBusyState(0x0);
break;
case CMD_MOVE:
systemInfos.distance = ((CMD_Move*)decodedCmd)->distance;
break;
case CMD_TURN:
systemInfos.turns = ((CMD_Turn*)decodedCmd)->turns;
case XBEE_TX_STATUS_TYPE:
if (xbeeFrame->ack == 0) {
if (systemInfos.rfProblem !=0)
systemInfos.rfProblem--;
} else {
if (systemInfos.rfProblem !=255)
systemInfos.rfProblem++;
}
break;
default:
/* All others commands must be processed in state machine
* in order to find what action to do and what answer to give
*/
break;
}
free(decodedCmd);
// if (xbeeFrame->data != NULL)
// free(xbeeFrame->data);
free(xbeeFrame);
}
free(cmd);
break;
case MSG_ID_BAT_NIVEAU:
@ -232,16 +264,16 @@ void APPLICATION_StateMachine() {
(systemInfos.state == stateRun) ||
(systemInfos.state == stateInMouvement)) {
/* command RESET is only applicable in those 3 states, otherwise it is rejected */
cmdSendAnswer(ANS_OK);
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
APPLICATION_TransitionToNewState(stateIdle);
} else
cmdSendAnswer(ANS_ERR);
cmdSendAnswer(systemInfos.senderAddress, ANS_ERR);
break;
case CMD_START_WITH_WATCHDOG:
case CMD_START_WITHOUT_WATCHDOG:
if (systemInfos.state == stateIdle) {
/* only state where START cmd is accepted */
cmdSendAnswer(ANS_OK);
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
APPLICATION_TransitionToNewState(stateRun);
@ -251,15 +283,15 @@ void APPLICATION_StateMachine() {
systemTimeout.watchdogMissedCnt=0;
}
} else
cmdSendAnswer(ANS_ERR);
cmdSendAnswer(systemInfos.senderAddress, ANS_ERR);
break;
case CMD_RESET_WATCHDOG:
if ((systemInfos.state == stateRun) || (systemInfos.state == stateInMouvement)) {
if ((systemTimeout.watchdogEnabled ==0 ) ||
((systemTimeout.watchdogCnt>=APPLICATION_WATCHDOG_MIN) && (systemTimeout.watchdogCnt<=APPLICATION_WATCHDOG_MAX)))
cmdSendAnswer(ANS_OK);
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
else
cmdSendAnswer(ANS_ERR);
cmdSendAnswer(systemInfos.senderAddress, ANS_ERR);
systemTimeout.watchdogCnt =0;
}
@ -271,17 +303,17 @@ void APPLICATION_StateMachine() {
if (((systemInfos.cmd == CMD_MOVE) && (systemInfos.distance !=0)) ||
((systemInfos.cmd == CMD_TURN) && (systemInfos.turns !=0))) {
systemInfos.endOfMouvement = 0;
cmdSendAnswer(ANS_OK);
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
APPLICATION_TransitionToNewState(stateInMouvement);
} // if TURN and MOVE are sent without parameter, do nothing: we are still in run state
} else if (systemInfos.state == stateInMouvement) { // in this state, MOVE and TURN cmds are accepted only if they come with no parameter
if (((systemInfos.cmd == CMD_MOVE) && (systemInfos.distance ==0)) ||
((systemInfos.cmd == CMD_TURN) && (systemInfos.turns ==0))) {
systemInfos.endOfMouvement = 1;
cmdSendAnswer(ANS_OK);
cmdSendAnswer(systemInfos.senderAddress, ANS_OK);
}
} else
cmdSendAnswer(ANS_ERR);
cmdSendAnswer(systemInfos.senderAddress, ANS_ERR);
break;
default: // commands no common for every states
break;

View file

@ -12,22 +12,44 @@
/* Definition des commandes */
CMD_Generic* cmdDecode(char* cmd) {
CMD_Generic* cmdDecode(char* cmd, uint8_t length) {
CMD_Generic* decodedCmd;
char cmd_type = cmd[0];
int val;
uint32_t startTime, endTime;
volatile uint32_t duration;
switch (cmd[0])
startTime = SysTick->VAL;
switch (cmd_type)
{
case CMD_MOVE:
decodedCmd = (CMD_Generic*)malloc(sizeof(CMD_Move));
((CMD_Move*)decodedCmd)->distance = ((uint16_t)cmd[1]<<8) + (uint16_t)cmd[2];
decodedCmd->type = cmd[0];
{
char rawCmd[length+1];
memcpy((void*)rawCmd, (void*)cmd, length);
rawCmd[length] = (char)0; /* 0 ending string */
sscanf (&rawCmd[1], "%d", &val);
((CMD_Move*)decodedCmd)->distance= (int16_t) val;
}
break;
case CMD_TURN:
decodedCmd = (CMD_Generic*)malloc(sizeof(CMD_Turn));
decodedCmd->type = cmd[0];
{
char rawCmd[length+1];
memcpy((void*)rawCmd, (void*)cmd, length);
rawCmd[length] = (char)0; /* 0 ending string */
((CMD_Turn*)decodedCmd)->turns = ((uint16_t)cmd[1]<<8) + (uint16_t)cmd[2];
((CMD_Turn*)decodedCmd)->turns = ((CMD_Turn*)decodedCmd)->turns * 1.4;
sscanf (&rawCmd[1], "%d", &val);
((CMD_Turn*)decodedCmd)->turns = (int16_t) val;
((CMD_Turn*)decodedCmd)->turns = ((CMD_Turn*)decodedCmd)->turns * 1.4;
}
break;
case CMD_PING:
@ -43,22 +65,29 @@ CMD_Generic* cmdDecode(char* cmd) {
case CMD_POWER_OFF:
decodedCmd = (CMD_Generic*)malloc(sizeof(CMD_Generic));
decodedCmd->type = cmd[0];
break;
default:
decodedCmd = CMD_DECODE_UNKNOWN;
}
endTime=SysTick->VAL;
if (endTime>startTime)
duration = (uint32_t)(SysTick->LOAD+1)-endTime+startTime;
else
duration = startTime-endTime;
return decodedCmd;
}
void cmdSendAnswer(uint8_t ans) {
void cmdSendAnswer(uint16_t address, uint8_t ans) {
ANS_Generic answer;
answer.ans = ans;
XBEE_SendData((char*)&answer, sizeof (answer));
XBEE_SendData(address, (char*)&answer, sizeof (answer));
}
void cmdSendBatteryLevel(char level) {
void cmdSendBatteryLevel(uint16_t address, char level) {
ANS_Battery answer;
char localLevel=level;
@ -68,19 +97,19 @@ void cmdSendBatteryLevel(char level) {
answer.ans = ANS_OK;
answer.bat_level = localLevel;
XBEE_SendData((char*)&answer, sizeof (answer));
XBEE_SendData(address, (char*)&answer, sizeof (answer));
}
void cmdSendVersion() {
void cmdSendVersion(uint16_t address) {
ANS_Version answer;
answer.ans = ANS_OK;
answer.version = SYSTEM_VERSION;
strcpy (answer.version, SYSTEM_VERSION_STR);
XBEE_SendData((char*)&answer, sizeof (answer));
XBEE_SendData(address, (char*)&answer, sizeof (answer));
}
void cmdSendBusyState(uint8_t state) {
void cmdSendBusyState(uint16_t address, uint8_t state) {
ANS_Busy_State answer;
answer.ans = ANS_OK;
@ -88,5 +117,5 @@ void cmdSendBusyState(uint8_t state) {
if (answer.state >1) answer.state=0;
XBEE_SendData((char*)&answer, sizeof (answer));
XBEE_SendData(address, (char*)&answer, sizeof (answer));
}

View file

@ -10,31 +10,39 @@
#include "application.h"
#define CMD_NONE 0x0
#define CMD_PING 0x1
#define CMD_RESET 0x2
#define CMD_START_WITH_WATCHDOG 0x3
#define CMD_RESET_WATCHDOG 0x4
#define CMD_GET_BATTERY 0x5
#define CMD_GET_VERSION 0x6
#define CMD_START_WITHOUT_WATCHDOG 0x7
#define CMD_MOVE 0x8
#define CMD_TURN 0x9
#define CMD_GET_BUSY_STATE 0xA
#define CMD_TEST 0xB
#define CMD_DEBUG 0xC
#define CMD_POWER_OFF 0xD
typedef enum {
CMD_NONE=0x0,
CMD_PING,
CMD_RESET,
CMD_START_WITH_WATCHDOG,
CMD_RESET_WATCHDOG,
CMD_GET_BATTERY,
CMD_GET_VERSION,
CMD_START_WITHOUT_WATCHDOG,
CMD_MOVE,
CMD_TURN,
CMD_GET_BUSY_STATE,
CMD_TEST,
CMD_DEBUG,
CMD_POWER_OFF
} CMD_CommandsType;
#define ANS_OK 0x80
#define ANS_ERR 0x81
#define ANS_UNKNOWN 0x82
typedef enum {
ANS_OK=0x80,
ANS_ERR,
ANS_UNKNOWN
} CMD_AnswersType;
#define ANS_BAT_OK 0x2
#define ANS_BAT_LOW 0x1
#define ANS_BAT_EMPTY 0x0
typedef enum {
ANS_BAT_EMPTY=0,
ANS_BAT_LOW,
ANS_BAT_OK
} CMD_BatteryLevelType;
#define ANS_STATE_NOT_BUSY 0x0
#define ANS_STATE_BUSY 0x1
typedef enum {
ANS_STATE_NOT_BUSY=0,
ANS_STATE_BUSY
} CMD_BusyType;
typedef struct __attribute__((packed)) {
uint8_t type;
@ -56,7 +64,7 @@ typedef struct __attribute__((packed)) {
typedef struct __attribute__((packed)) {
uint8_t ans;
uint8_t version;
char version[6];
} ANS_Version;
typedef struct __attribute__((packed)) {
@ -72,10 +80,10 @@ typedef struct __attribute__((packed)) {
#define CMD_DECODE_INVALID ((CMD_Generic*)NULL)
#define CMD_DECODE_UNKNOWN ((CMD_Generic*)UINT32_MAX)
CMD_Generic* cmdDecode(char* cmd);
void cmdSendAnswer(uint8_t ans);
void cmdSendBatteryLevel(char level);
void cmdSendVersion();
void cmdSendBusyState(uint8_t state);
CMD_Generic* cmdDecode(char* cmd, uint8_t length);
void cmdSendAnswer(uint16_t address, uint8_t ans);
void cmdSendBatteryLevel(uint16_t address, char level);
void cmdSendVersion(uint16_t address);
void cmdSendBusyState(uint16_t address, uint8_t state);
#endif /* INC_CMD_H_ */

View file

@ -7,7 +7,7 @@
#include "stm32l0xx_hal.h"
#include "cmsis_os.h"
#define SYSTEM_VERSION_STR "version 2.0\r"
#define SYSTEM_VERSION_STR "2.0"
#define SYSTEM_VERSION 0x20
#define STACK_SIZE 0x100

View file

@ -42,12 +42,6 @@ typedef struct {
MOTEURS_EtatMoteur MOTEURS_EtatMoteurGauche, MOTEURS_EtatMoteurDroit = {0};
MOTEURS_EtatDiff MOTEURS_EtatDifferentiel;
uint16_t MOTEUR_DerniereValEncodeursG;
uint16_t MOTEUR_DerniereValEncodeursD;
#define MOTEUR_GAUCHE 0
#define MOTEUR_DROIT 1
#define MOTEUR_Kp 15
#define MOTEUR_DELAY 3
@ -101,6 +95,8 @@ void MOTEURS_Init(void) {
xStackMoteursAsservissement, /* Array to use as the task's stack. */
&xTaskMoteursAsservissement); /* Variable to hold the task's data structure. */
vTaskSuspend(xHandleMoteursAsservissement); // On ne lance la tache d'asservissement que lorsque'une commande moteur arrive
MOTEURS_DesactiveAlim();
}
void MOTEURS_Avance(uint32_t distance) {
@ -136,19 +132,37 @@ void MOTEURS_TachePrincipale(void* params) {
switch (msg.id) {
case MSG_ID_MOTEURS_MOVE:
distance = *((uint32_t*)msg.data);
MOTEURS_EtatDifferentiel.distance = distance;
MOTEURS_EtatDifferentiel.tours = 0;
MOTEURS_EtatMoteurGauche.consigne=50;
MOTEURS_EtatMoteurDroit.consigne=50;
// TODO: trucs a faire ici
vTaskResume(xHandleMoteursAsservissement);
break;
case MSG_ID_MOTEURS_TURN:
tours = *((uint32_t*)msg.data);
MOTEURS_EtatDifferentiel.distance = 0;
MOTEURS_EtatDifferentiel.tours = tours;
MOTEURS_EtatMoteurGauche.consigne=50;
MOTEURS_EtatMoteurDroit.consigne=50;
// TODO: trucs a faire ici
vTaskResume(xHandleMoteursAsservissement);
break;
case MSG_ID_MOTEURS_STOP:
// TODO: trucs a faire ici
vTaskSuspend(xHandleMoteursAsservissement);
MOTEURS_EtatDifferentiel.distance = 0;
MOTEURS_EtatDifferentiel.tours = 0;
MOTEURS_EtatMoteurGauche.consigne=0;
MOTEURS_EtatMoteurDroit.consigne=0;
if ((MOTEURS_CorrectionEncodeur(MOTEURS_EtatMoteurGauche.encodeur) ==0) &&
(MOTEURS_CorrectionEncodeur(MOTEURS_EtatMoteurDroit.encodeur) ==0))
// Les moteurs sont déjà arretés
vTaskSuspend(xHandleMoteursAsservissement);
else
// Les moteurs tournent encore
vTaskResume(xHandleMoteursAsservissement);
break;
default:
break;
@ -181,8 +195,14 @@ void MOTEURS_TacheAsservissement( void* params ) {
deltaD = MOTEURS_EtatMoteurDroit.consigne - encodeurDroit;
if (((MOTEURS_EtatMoteurDroit.consigne ==0) && (MOTEURS_EtatMoteurGauche.consigne ==0)) &&
((deltaD==0) && (deltaG==0))) MOTEURS_DesactiveAlim();
else MOTEURS_ActiveAlim();
((deltaD==0) && (deltaG==0))) {
MOTEURS_DesactiveAlim();
vTaskSuspend(xHandleMoteursAsservissement);
}
else if (MOTEURS_EtatAlim() == GPIO_PIN_RESET) {
MOTEURS_ActiveAlim();
}
if (deltaG !=0) {
MOTEURS_EtatMoteurGauche.commande = MOTEURS_EtatMoteurGauche.commande + MOTEUR_Kp*deltaG;

View file

@ -10,6 +10,7 @@
#include "semphr.h"
#include <stdlib.h>
#include <string.h>
#include "stm32l0xx_ll_usart.h"
extern UART_HandleTypeDef hlpuart1;
extern DMA_HandleTypeDef hdma_lpuart1_tx;
@ -28,15 +29,23 @@ StaticTask_t xTaskXbeeRX;
StackType_t xStackXbeeRX[ STACK_SIZE ];
TaskHandle_t xHandleXbeeRX = NULL;
uint8_t txBuffer[XBEE_RX_BUFFER_MAX_LENGTH]={0};
uint16_t txIndex;
uint16_t txDataToSend;
void XBEE_RxThread(void* params);
SemaphoreHandle_t xHandleSemaphoreRX = NULL;
StaticSemaphore_t xSemaphoreRx;
uint8_t* rxBuffer;
uint8_t rxWaitForACK;
uint8_t rxBuffer[XBEE_RX_BUFFER_MAX_LENGTH]={0};
//uint8_t rxWaitForACK =0;
uint8_t rxPhase;
uint16_t rxFrameLength;
uint16_t rxDataToReceive;
uint16_t rxIndex;
#define XBEE_RX_PHASE_SOF 0
#define XBEE_RX_PHASE_HEADER 1
#define XBEE_RX_PHASE_BODY 2
@ -46,15 +55,27 @@ SemaphoreHandle_t xHandleSemaphoreTX_ACK = NULL;
StaticSemaphore_t xSemaphoreTX;
StaticSemaphore_t xSemaphoreTX_ACK;
uint8_t* txBuffer;
void XBEE_Init(void) {
xHandleSemaphoreTX = xSemaphoreCreateBinaryStatic( &xSemaphoreTX );
xHandleSemaphoreTX_ACK = xSemaphoreCreateBinaryStatic( &xSemaphoreTX_ACK );
xSemaphoreGive(xHandleSemaphoreTX);
//xSemaphoreTake(xHandleSemaphoreTX_ACK);
rxBuffer=(uint8_t*)malloc(XBEE_RX_BUFFER_MAX_LENGTH);
rxWaitForACK = 0;
xHandleSemaphoreRX = xSemaphoreCreateBinaryStatic( &xSemaphoreRx );
/* Create the task without using any dynamic memory allocation. */
xHandleXbeeRX = xTaskCreateStatic(
XBEE_RxThread, /* Function that implements the task. */
"XBEE Rx", /* Text name for the task. */
STACK_SIZE, /* Number of indexes in the xStack array. */
NULL, /* Parameter passed into the task. */
PriorityMoteurs,/* Priority at which the task is created. */
xStackXbeeRX, /* Array to use as the task's stack. */
&xTaskXbeeRX); /* Variable to hold the task's data structure. */
vTaskResume(xHandleXbeeRX);
/* Enable Xbee */
HAL_GPIO_WritePin(XBEE_RESET_GPIO_Port, XBEE_RESET_Pin, GPIO_PIN_SET);
}
/**** Support functions ****/
@ -110,33 +131,6 @@ char* XBEE_EncodeWithEscapeChar(char* data, int length, int *encodedLength) {
return encodedData;
}
/**
* Convert escaped data into raw data. Create a new buffer that is returned
*
* \param encodedData pointer on encoded data
* \param encodedLength length of encoded data
* \param length length of raw data
* \return new buffer allocated without escaped char
*/
char* XBEE_DecodeWithoutEscapeChar(char* encodedData, int encodedLength, int *length) {
char* data = (char*)malloc(encodedLength); // on prévoit un buffer aussi grand que celui avec caractère d'echappement,
// au cas où aucun caractère d'echappement ne serait present
*length = encodedLength; // par défaut, on considère que les données brutes ont la même taille que
// celles avec caractères d'echappement.
for (char* p=data; p< (data + encodedLength); p++) {
if (*encodedData == (char)XBEE_API_ESCAPE_CHAR) {
encodedData++; // on saute le caractere d'echappement
*p = (char) (*encodedData & 0x20);
} else
*p = *encodedData;
encodedData++;
}
return data;
}
/**
* Get a raw buffer and convert it into a transmission frame
*
@ -146,19 +140,16 @@ char* XBEE_DecodeWithoutEscapeChar(char* encodedData, int encodedLength, int *le
* \param frameLength length of frame
* \return new frame (allocated) containing escaped data
*/
char* XBEE_EncodeTransmissionFrame(char* data, int length, uint16_t destination, int* frameLength) {
uint8_t checksum;
char* frame;
void XBEE_EncodeTransmissionFrame(char* data, int length, uint16_t destination, char* frame, int* frameLength) {
uint8_t checksum=0;
uint16_t localLength=0;
char* p;
int encodedLength;
char *encodedData = XBEE_EncodeWithEscapeChar(data, length, &encodedLength);
localLength = length+9;
*frameLength= encodedLength+9;
frame = (char*)malloc(*frameLength);
frame[0] = '~';
frame[1] = (char)((uint16_t)(*frameLength-3)>>8);
frame[2] = (char)((uint16_t)(*frameLength-3));
frame[0] = (char)XBEE_FRAME_SOF_CHAR;
frame[1] = (char)((uint16_t)(localLength-4)>>8);
frame[2] = (char)((uint16_t)(localLength-4));
frame[3] = (char)XBEE_TX_16BIT_REQUEST_TYPE;
frame[4] = 0x1;
@ -167,22 +158,25 @@ char* XBEE_EncodeTransmissionFrame(char* data, int length, uint16_t destination,
frame[7] = 0x0;
char* p_data = encodedData;
for (char *p=&frame[8]; p<&frame[8] + encodedLength; p++, p_data++) {
*p= *p_data;
for (p = &frame[8]; p< (data + length); p++) {
if ((*data == (char)XBEE_API_ESCAPE_CHAR) || (*data == (char)XBEE_API_START_OF_FRAME) ||
(*data == (char)XBEE_API_XOFF) ||(*data == (char)XBEE_API_XON)) {
*p = (char) XBEE_API_ESCAPE_CHAR;
p++;
*p = *data^0x20;
} else
*p = *data;
data++;
}
/* calcul du checksum */
checksum =0;
for (int i=3; i<*frameLength; i++) {
for (int i=3; i<(localLength-1); i++) {
checksum += (uint8_t)frame[i];
}
frame[*frameLength] = 0xFF-checksum;
free ((void*)encodedData);
return frame;
*p = 0xFF-checksum;
*frameLength = localLength;
}
/**
@ -207,7 +201,8 @@ XBEE_Status XBEE_DecodeFrame(char* rawFrame, XBEE_INCOMING_FRAME** incomingFrame
uint16_t rawFrameLength;
uint8_t checksum;
XBEE_Status status = XBEE_OK;
int incomingDataLength = 0;
int allocatedSize;
int dataSize;
int i;
@ -223,34 +218,56 @@ XBEE_Status XBEE_DecodeFrame(char* rawFrame, XBEE_INCOMING_FRAME** incomingFrame
if (checksum != 0xFF)
return XBEE_INVALID_FRAME;
*incomingFrame = (XBEE_INCOMING_FRAME*) malloc(sizeof(XBEE_INCOMING_FRAME)); /* Allocate a generic frame struct */
(*incomingFrame)->type = frame_type;
switch (frame_type) {
case XBEE_RX_16BIT_PACKET_TYPE:
dataSize = rawFrameLength-5; // there is 5 bytes of "other" data than truly data bytes in a frame
allocatedSize = sizeof(XBEE_INCOMING_FRAME)+dataSize;
*incomingFrame = (XBEE_INCOMING_FRAME*) malloc(allocatedSize); /* Allocate a generic frame struct */
(*incomingFrame)->type = frame_type;
/* Get source address */
(*incomingFrame)->source_addr = (((uint16_t)rawFrame[4])<<8) + (uint16_t)rawFrame[5];
(*incomingFrame)->data = XBEE_DecodeWithoutEscapeChar(&rawFrame[8], rawFrameLength-6, &incomingDataLength);
//XBEE_DecodeWithoutEscapeChar(&rawFrame[8], rawFrameLength-5, (*incomingFrame)->data, &incomingDataLength); // Data = Frame length -5
(*incomingFrame)->length = (uint8_t)(dataSize);
(*incomingFrame)->ack = 0;
for (i=0; i<dataSize; i++)
(*incomingFrame)->data[i] = rawFrame[i+8];
break;
case XBEE_MODEM_STATUS_TYPE:
allocatedSize = sizeof(XBEE_INCOMING_FRAME); // no data
*incomingFrame = (XBEE_INCOMING_FRAME*) malloc(allocatedSize); /* Allocate a generic frame struct */
(*incomingFrame)->type = frame_type;
(*incomingFrame)->modem_status = rawFrame[4];
(*incomingFrame)->data=0x0;
(*incomingFrame)->data[0]=0x0;
(*incomingFrame)->length = 0;
break;
case XBEE_TX_STATUS_TYPE:
allocatedSize = sizeof(XBEE_INCOMING_FRAME); // no data
*incomingFrame = (XBEE_INCOMING_FRAME*) malloc(allocatedSize); /* Allocate a generic frame struct */
(*incomingFrame)->ack = rawFrame[5];
(*incomingFrame)->data=0x0;
(*incomingFrame)->data[0]=0x0;
(*incomingFrame)->length = 0;
break;
case XBEE_EXTENDED_TX_STATUS_TYPE:
allocatedSize = sizeof(XBEE_INCOMING_FRAME); // no data
*incomingFrame = (XBEE_INCOMING_FRAME*) malloc(allocatedSize); /* Allocate a generic frame struct */
(*incomingFrame)->ack = rawFrame[8];
(*incomingFrame)->data=0x0;
(*incomingFrame)->data[0]=0x0;
(*incomingFrame)->length = 0;
break;
default:
free (*incomingFrame);
*incomingFrame=NULL;
return XBEE_INVALID_FRAME;
};
} else status = XBEE_INVALID_FRAME;
@ -267,12 +284,11 @@ XBEE_Status XBEE_DecodeFrame(char* rawFrame, XBEE_INCOMING_FRAME** incomingFrame
* \param length length of data to send
* \return status of decoding: XBEE_OK if decoding is successful,
* XBEE_TX_ERROR in case of sending error,
* XBEE_TX_ACK_ERROR in case frame was not acknowledge by detination part
* XBEE_TX_TIMEOUT in case semaphore takes too long
*/
int XBEE_SendData(char* data, int length) {
int data_length;
int XBEE_SendData(uint16_t address, char* data, int length) {
BaseType_t state;
XBEE_INCOMING_FRAME* incomingFrame;
int status = XBEE_OK;
// Prevents successive calls to overlap
state = xSemaphoreTake(xHandleSemaphoreTX, pdMS_TO_TICKS(XBEE_TX_SEMAPHORE_WAIT)); // wait max 500 ms (to avoid interlocking)
@ -281,50 +297,33 @@ int XBEE_SendData(char* data, int length) {
if answer is false, it means timeout appends
We should probably reset something in "else" branch */
/* TODO: stuff to do here for converting data into API frame */
txBuffer = (uint8_t*)XBEE_EncodeWithEscapeChar(data, length, &data_length);
XBEE_EncodeTransmissionFrame(data, length, address, (char*) txBuffer, (int*)&txDataToSend);
if (txBuffer!=NULL) {
if (HAL_UART_Transmit_DMA(&hlpuart1, txBuffer, data_length)!= HAL_OK)
return XBEE_TX_ERROR;
else {
rxWaitForACK = 1; /* wait for TX ack */
// Wait for ACK frame after TX
state = xSemaphoreTake(xHandleSemaphoreTX_ACK, pdMS_TO_TICKS(XBEE_TX_SEMAPHORE_WAIT)); // wait max 500 ms (to avoid interlocking)
if (XBEE_DecodeFrame((char*) rxBuffer, &incomingFrame)!=XBEE_OK)
return XBEE_TX_ACK_ERROR;
else {
if (incomingFrame == 0x0)
return XBEE_TX_ACK_ERROR;
else if ((incomingFrame->type != XBEE_TX_STATUS_TYPE) || (incomingFrame->ack != XBEE_TX_STATUS_SUCCESS)) {
free ((XBEE_INCOMING_FRAME*) incomingFrame);
return XBEE_TX_ACK_ERROR;
}
}
}
} else return XBEE_TX_ERROR;
} else return XBEE_TX_ERROR;
LL_USART_TransmitData8(hlpuart1.Instance, txBuffer[0]);
txIndex =1;
LL_USART_EnableIT_TXE(hlpuart1.Instance); // enable TX Interrupt
} else status= XBEE_TX_TIMEOUT;
return length;
return status;
}
/**
* DMA Interrupt request for transmission. Call when transmission is finished
*
* \param UartHandle not used
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) {
void XBEE_TX_IRQHandler(void) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
/* Free transmit buffer */
free (txBuffer);
if (rxWaitForACK != 1) /* we are waiting for an acknowledge frame, so do not give semaphore yet */
LL_USART_TransmitData8(hlpuart1.Instance, txBuffer[txIndex]);
txIndex++;
if (txIndex == txDataToSend) {
LL_USART_DisableIT_TXE(hlpuart1.Instance);
xSemaphoreGiveFromISR( xHandleSemaphoreTX, &xHigherPriorityTaskWoken );
}
/* If xHigherPriorityTaskWoken was set to true you
we should yield. The actual macro used here is
port specific. */
portYIELD_FROM_ISR(xHigherPriorityTaskWoken );
if (xHigherPriorityTaskWoken) {
/* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch
should be performed to ensure the interrupt returns directly to the highest
priority task. The macro used for this purpose is dependent on the port in
use and may be called portEND_SWITCHING_ISR(). */
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
}
/***** Rx Part *****/
@ -335,53 +334,78 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) {
* \param params not used
*/
void XBEE_RxThread(void* params) {
BaseType_t state;
XBEE_INCOMING_FRAME* incomingFrame;
XBEE_INCOMING_FRAME *incomingFrame;
rxPhase= XBEE_RX_PHASE_HEADER;
while (HAL_UART_Receive_DMA(&hlpuart1, rxBuffer, 3)== HAL_OK); // start reception of frame
rxPhase= XBEE_RX_PHASE_SOF;
rxFrameLength=0;
rxDataToReceive=1;
rxIndex=0;
while (HAL_UART_Receive_IT(&hlpuart1, rxBuffer, 1)!= HAL_OK); // try starting reception of frame
LL_USART_Disable(hlpuart1.Instance);
LL_USART_DisableOverrunDetect(hlpuart1.Instance);
LL_USART_Enable(hlpuart1.Instance);
// endless task
while (1) {
while ((state = xSemaphoreTake(xHandleSemaphoreRX, portMAX_DELAY))==pdTRUE); // wait forever
if (xSemaphoreTake(xHandleSemaphoreRX, portMAX_DELAY)==pdTRUE) { // wait forever
/* Process frame */
if (XBEE_DecodeFrame((char*) rxBuffer, &incomingFrame)==XBEE_OK) // frame is valid
if (incomingFrame != 0x0) // frame is valid
MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_XBEE_CMD, (QueueHandle_t)0x0, (void*)incomingFrame);
/* Process frame */
if (XBEE_DecodeFrame((char*) rxBuffer, &incomingFrame)==XBEE_OK) { // frame is valid
if (incomingFrame != 0x0) // frame is valid
MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_XBEE_CMD, (QueueHandle_t)0x0, (void*)incomingFrame);
// if (rxBuffer[3]== XBEE_RX_16BIT_PACKET_TYPE) {
// MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_XBEE_CMD, (QueueHandle_t)0x0, (void*)0x0);
}
for (int i=0; i<XBEE_RX_BUFFER_MAX_LENGTH; i++)
rxBuffer[i]=0xFF;
}
}
}
/**
* DMA IRQ handler for reception. Receive a complete frame send send event to sending frame in case of acknowledge frame or to receive task otherwise
*
* \param UartHandle not used
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) {
void XBEE_RX_IRQHandler(void) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
uint16_t frameLength;
uint8_t data;
if (rxPhase == XBEE_RX_PHASE_HEADER) { // we just received header part
frameLength=XBEE_GetFrameLength(rxBuffer); /* Compute body part of the frame + checksum */
data = LL_USART_ReceiveData8(hlpuart1.Instance); // lecture de l'octet reçu
if (HAL_UART_Receive_DMA(&hlpuart1, rxBuffer+3, frameLength+1)== HAL_OK) {
/* Reception of body part started successfully */
rxPhase = XBEE_RX_PHASE_BODY;
} else {
/* Failed to start reception of body
* Restart reception of header */
while (HAL_UART_Receive_DMA(&hlpuart1, rxBuffer, 3)!= HAL_OK); // try to receive header
switch (rxPhase) {
case XBEE_RX_PHASE_SOF:
if (data == XBEE_FRAME_SOF_CHAR) {
rxBuffer[0] = data;
rxPhase = XBEE_RX_PHASE_HEADER;
rxIndex = 1;
}
} else { // we just received body part. Frame is complete
if (rxWaitForACK) {
xSemaphoreGiveFromISR( xHandleSemaphoreTX_ACK, &xHigherPriorityTaskWoken); /* Send event to sending function */
xSemaphoreGiveFromISR( xHandleSemaphoreTX, &xHigherPriorityTaskWoken ); /* Allow new sending data */
} else {
break;
case XBEE_RX_PHASE_HEADER:
rxBuffer[rxIndex] = data;
rxIndex ++;
if (rxIndex==3) {
// header reçu, calcul de la longueur de la frame
rxFrameLength = (((uint16_t)rxBuffer[1]) << 8) + (uint16_t)rxBuffer[2];
rxDataToReceive = rxFrameLength +1; // +1 for checksum
rxPhase = XBEE_RX_PHASE_BODY;
}
break;
case XBEE_RX_PHASE_BODY:
rxBuffer[rxIndex] = data;
if (rxBuffer[rxIndex-1] == XBEE_API_ESCAPE_CHAR)
rxBuffer[rxIndex-1] = rxBuffer[rxIndex] ^ 0x20;
else {
rxIndex++;
rxDataToReceive--;
}
if (!rxDataToReceive) {
rxIndex=0;
rxPhase = XBEE_RX_PHASE_SOF;
xSemaphoreGiveFromISR( xHandleSemaphoreRX, &xHigherPriorityTaskWoken ); /* send event to receive task to process received task */
}
rxPhase = XBEE_RX_PHASE_HEADER;
while (HAL_UART_Receive_DMA(&hlpuart1, rxBuffer, 3)!= HAL_OK); // try to receive header
break;
default:
while(1);
}
if (xHigherPriorityTaskWoken) {
@ -392,3 +416,25 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) {
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
}
/**
* DMA IRQ handler for reception. Receive a complete frame send send event to sending frame in case of acknowledge frame or to receive task otherwise
*
* \param UartHandle not used
*/
void LPUART1_IRQHandler(void) {
if (LL_USART_IsActiveFlag_RXNE(hlpuart1.Instance)) {
XBEE_RX_IRQHandler();
} else if (LL_USART_IsActiveFlag_TXE(hlpuart1.Instance)) {
XBEE_TX_IRQHandler();
} else {
if (LL_USART_IsActiveFlag_TC(hlpuart1.Instance))
LL_USART_DisableIT_TC(hlpuart1.Instance);
else if (LL_USART_IsActiveFlag_IDLE(hlpuart1.Instance))
LL_USART_ClearFlag_IDLE(hlpuart1.Instance);
else if (LL_USART_IsActiveFlag_ORE(hlpuart1.Instance)) {
LL_USART_ClearFlag_ORE(hlpuart1.Instance);
}
}
}

View file

@ -17,20 +17,21 @@ typedef enum {
XBEE_RX_TIMEOUT=-3,
XBEE_RX_ERROR=-4,
XBEE_TX_ERROR=-5,
XBEE_INVALID_FRAME=-6
XBEE_INVALID_FRAME=-6,
XBEE_TX_TIMEOUT=-7,
} XBEE_Status;
#define XBEE_RX_PACKET_TYPE 0x90
#define XBEE_RX_EXPLICIT_TYPE 0x91
#define XBEE_TX_STATUS_TYPE 0x89
#define XBEE_AT_CMD_RESPONSE_TYPE 0x88
#define XBEE_MODEM_STATUS_TYPE 0x8A
#define XBEE_EXTENDED_TX_STATUS_TYPE 0x8B
#define XBEE_LOCAL_AT_CMD_TYPE 0x08
#define XBEE_TX_REQUEST_TYPE 0x10
#define XBEE_TX_EXPLICIT_TYPE 0x11
#define XBEE_TX_16BIT_REQUEST_TYPE 0x01
#define XBEE_RX_16BIT_PACKET_TYPE 0x81
#define XBEE_RX_PACKET_TYPE 0x90
#define XBEE_RX_EXPLICIT_TYPE 0x91
#define XBEE_TX_STATUS_TYPE 0x89
#define XBEE_AT_CMD_RESPONSE_TYPE 0x88
#define XBEE_MODEM_STATUS_TYPE 0x8A
#define XBEE_EXTENDED_TX_STATUS_TYPE 0x8B
#define XBEE_LOCAL_AT_CMD_TYPE 0x08
#define XBEE_TX_REQUEST_TYPE 0x10
#define XBEE_TX_EXPLICIT_TYPE 0x11
#define XBEE_TX_16BIT_REQUEST_TYPE 0x01
#define XBEE_RX_16BIT_PACKET_TYPE 0x81
#define XBEE_AT_STATUS_SUCCESS 0
#define XBEE_AT_STATUS_ERROR 1
@ -49,15 +50,18 @@ typedef enum {
#define XBEE_RX_OPTIONS_BRODCASTED 0x02
#define XBEE_RX_OPTIONS_PAN_BROADCASTED 0x04
#define XBEE_FRAME_SOF_CHAR 0x7E // '~'
typedef struct {
uint8_t type;
uint16_t source_addr;
char* data;
uint8_t length;
char ack;
char modem_status;
char data[];
} XBEE_INCOMING_FRAME;
void XBEE_Init(void);
int XBEE_SendData(char* data, int length);
int XBEE_SendData(uint16_t address, char* data, int length);
#endif /* INC_XBEE_H_ */

View file

@ -65,7 +65,7 @@
#define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
#define configTOTAL_HEAP_SIZE ((size_t)1024)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configMAX_TASK_NAME_LEN ( 25 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1

View file

@ -46,7 +46,6 @@ ADC_HandleTypeDef hadc;
UART_HandleTypeDef hlpuart1;
DMA_HandleTypeDef hdma_lpuart1_tx;
DMA_HandleTypeDef hdma_lpuart1_rx;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
@ -300,7 +299,8 @@ static void MX_LPUART1_UART_Init(void)
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_DMADISABLEONERROR_INIT;
hlpuart1.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
Error_Handler();
@ -738,8 +738,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
if ((htim->Instance == TIM2) || (htim->Instance == TIM21)) /* Timers des encodeurs */
MOTEURS_TimerEncodeurUpdate(htim);
/* USER CODE END Callback 1 */
}

View file

@ -26,8 +26,6 @@
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_lpuart1_tx;
extern DMA_HandleTypeDef hdma_lpuart1_rx;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -197,23 +195,6 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
__HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
/* LPUART1_RX Init */
hdma_lpuart1_rx.Instance = DMA1_Channel3;
hdma_lpuart1_rx.Init.Request = DMA_REQUEST_5;
hdma_lpuart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_lpuart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_lpuart1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_lpuart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_lpuart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_lpuart1_rx.Init.Mode = DMA_NORMAL;
hdma_lpuart1_rx.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_lpuart1_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(huart,hdmarx,hdma_lpuart1_rx);
/* LPUART1 interrupt Init */
HAL_NVIC_SetPriority(LPUART1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(LPUART1_IRQn);
@ -248,7 +229,6 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* LPUART1 DMA DeInit */
HAL_DMA_DeInit(huart->hdmatx);
HAL_DMA_DeInit(huart->hdmarx);
/* LPUART1 interrupt DeInit */
HAL_NVIC_DisableIRQ(LPUART1_IRQn);

View file

@ -58,7 +58,6 @@
/* External variables --------------------------------------------------------*/
extern ADC_HandleTypeDef hadc;
extern DMA_HandleTypeDef hdma_lpuart1_tx;
extern DMA_HandleTypeDef hdma_lpuart1_rx;
extern UART_HandleTypeDef hlpuart1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim21;
@ -139,17 +138,16 @@ void EXTI4_15_IRQHandler(void)
/**
* @brief This function handles DMA1 channel 2 and channel 3 interrupts.
*/
void DMA1_Channel2_3_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
/* USER CODE END DMA1_Channel2_3_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
HAL_DMA_IRQHandler(&hdma_lpuart1_rx);
/* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */
/* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//void DMA1_Channel2_3_IRQHandler(void)
//{
// /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
//
// /* USER CODE END DMA1_Channel2_3_IRQn 0 */
// HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
// /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */
//
// /* USER CODE END DMA1_Channel2_3_IRQn 1 */
//}
/**
* @brief This function handles ADC, COMP1 and COMP2 interrupts (COMP interrupts through EXTI lines 21 and 22).
@ -210,16 +208,16 @@ void TIM21_IRQHandler(void)
/**
* @brief This function handles LPUART1 global interrupt / LPUART1 wake-up interrupt through EXTI line 28.
*/
void LPUART1_IRQHandler(void)
{
/* USER CODE BEGIN LPUART1_IRQn 0 */
/* USER CODE END LPUART1_IRQn 0 */
HAL_UART_IRQHandler(&hlpuart1);
/* USER CODE BEGIN LPUART1_IRQn 1 */
/* USER CODE END LPUART1_IRQn 1 */
}
//void LPUART1_IRQHandler(void)
//{
// /* USER CODE BEGIN LPUART1_IRQn 0 */
//
// /* USER CODE END LPUART1_IRQn 0 */
// HAL_UART_IRQHandler(&hlpuart1);
// /* USER CODE BEGIN LPUART1_IRQn 1 */
//
// /* USER CODE END LPUART1_IRQn 1 */
//}
/* USER CODE BEGIN 1 */

View file

@ -1,8 +1,8 @@
/**
******************************************************************************
* @file startup_stm32l010x6.s
* @file startup_stm32l071xx.s
* @author MCD Application Team
* @brief STM32L010x6 Devices vector table for GCC toolchain.
* @brief STM32L071xx Devices vector table for GCC toolchain.
* This module performs:
* - Set the initial SP
* - Set the initial PC == Reset_Handler,
@ -14,13 +14,12 @@
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
* All rights reserved.</center></h2>
* Copyright (c) 2016 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
@ -51,27 +50,10 @@ defined in linker script */
Reset_Handler:
ldr r0, =_estack
mov sp, r0 /* set stack pointer */
/* Call the clock system initialization function.*/
bl SystemInit
/*Check if boot space corresponds to system memory*/
LDR R0,=0x00000004
LDR R1, [R0]
LSRS R1, R1, #24
LDR R2,=0x1F
CMP R1, R2
BNE ApplicationStart
/*SYSCFG clock enable*/
LDR R0,=0x40021034
LDR R1,=0x00000001
STR R1, [R0]
/*Set CFGR1 register with flash memory remap at address 0*/
LDR R0,=0x40010000
LDR R1,=0x00000000
STR R1, [R0]
ApplicationStart:
/* Copy the data segment initializers from flash to SRAM */
ldr r0, =_sdata
ldr r1, =_edata
@ -103,8 +85,6 @@ LoopFillZerobss:
cmp r2, r4
bcc FillZerobss
/* Call the clock system intitialization function.*/
bl SystemInit
/* Call static constructors */
bl __libc_init_array
/* Call the application's entry point.*/
@ -159,7 +139,7 @@ g_pfnVectors:
.word PendSV_Handler
.word SysTick_Handler
.word WWDG_IRQHandler /* Window WatchDog */
.word 0 /* Reserved */
.word PVD_IRQHandler /* PVD through EXTI Line detection */
.word RTC_IRQHandler /* RTC through the EXTI line */
.word FLASH_IRQHandler /* FLASH */
.word RCC_IRQHandler /* RCC */
@ -170,22 +150,22 @@ g_pfnVectors:
.word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
.word DMA1_Channel2_3_IRQHandler /* DMA1 Channel 2 and Channel 3 */
.word DMA1_Channel4_5_6_7_IRQHandler /* DMA1 Channel 4, Channel 5, Channel 6 and Channel 7*/
.word ADC1_IRQHandler /* ADC1 */
.word ADC1_COMP_IRQHandler /* ADC1, COMP1 and COMP2 */
.word LPTIM1_IRQHandler /* LPTIM1 */
.word 0 /* Reserved */
.word USART4_5_IRQHandler /* USART4 and USART 5 */
.word TIM2_IRQHandler /* TIM2 */
.word 0 /* Reserved */
.word 0 /* Reserved */
.word 0 /* Reserved */
.word 0 /* Reserved */
.word TIM3_IRQHandler /* TIM3 */
.word TIM6_IRQHandler /* TIM6 and DAC */
.word TIM7_IRQHandler /* TIM7 */
.word 0 /* Reserved */
.word TIM21_IRQHandler /* TIM21 */
.word 0 /* Reserved */
.word 0 /* Reserved */
.word I2C3_IRQHandler /* I2C3 */
.word TIM22_IRQHandler /* TIM22 */
.word I2C1_IRQHandler /* I2C1 */
.word 0 /* Reserved */
.word I2C2_IRQHandler /* I2C2 */
.word SPI1_IRQHandler /* SPI1 */
.word 0 /* Reserved */
.word 0 /* Reserved */
.word SPI2_IRQHandler /* SPI2 */
.word USART1_IRQHandler /* USART1 */
.word USART2_IRQHandler /* USART2 */
.word LPUART1_IRQHandler /* LPUART1 */
.word 0 /* Reserved */
@ -217,6 +197,9 @@ g_pfnVectors:
.weak WWDG_IRQHandler
.thumb_set WWDG_IRQHandler,Default_Handler
.weak PVD_IRQHandler
.thumb_set PVD_IRQHandler,Default_Handler
.weak RTC_IRQHandler
.thumb_set RTC_IRQHandler,Default_Handler
@ -244,24 +227,51 @@ g_pfnVectors:
.weak DMA1_Channel4_5_6_7_IRQHandler
.thumb_set DMA1_Channel4_5_6_7_IRQHandler,Default_Handler
.weak ADC1_IRQHandler
.thumb_set ADC1_IRQHandler,Default_Handler
.weak ADC1_COMP_IRQHandler
.thumb_set ADC1_COMP_IRQHandler,Default_Handler
.weak LPTIM1_IRQHandler
.thumb_set LPTIM1_IRQHandler,Default_Handler
.weak USART4_5_IRQHandler
.thumb_set USART4_5_IRQHandler,Default_Handler
.weak TIM2_IRQHandler
.thumb_set TIM2_IRQHandler,Default_Handler
.weak TIM3_IRQHandler
.thumb_set TIM3_IRQHandler,Default_Handler
.weak TIM6_IRQHandler
.thumb_set TIM6_IRQHandler,Default_Handler
.weak TIM7_IRQHandler
.thumb_set TIM7_IRQHandler,Default_Handler
.weak TIM21_IRQHandler
.thumb_set TIM21_IRQHandler,Default_Handler
.weak I2C3_IRQHandler
.thumb_set I2C3_IRQHandler,Default_Handler
.weak TIM22_IRQHandler
.thumb_set TIM22_IRQHandler,Default_Handler
.weak I2C1_IRQHandler
.thumb_set I2C1_IRQHandler,Default_Handler
.weak I2C2_IRQHandler
.thumb_set I2C2_IRQHandler,Default_Handler
.weak SPI1_IRQHandler
.thumb_set SPI1_IRQHandler,Default_Handler
.weak SPI2_IRQHandler
.thumb_set SPI2_IRQHandler,Default_Handler
.weak USART1_IRQHandler
.thumb_set USART1_IRQHandler,Default_Handler
.weak USART2_IRQHandler
.thumb_set USART2_IRQHandler,Default_Handler
@ -271,5 +281,4 @@ g_pfnVectors:
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View file

@ -35,13 +35,13 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_check_serial_number" value="true"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value="49FF67064970535516370687"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="true"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{&quot;fVersion&quot;:1,&quot;fItems&quot;:[{&quot;fDisplayName&quot;:&quot;Reset&quot;,&quot;fIsSuppressible&quot;:false,&quot;fResetAttribute&quot;:&quot;Software system reset&quot;,&quot;fResetStrategies&quot;:[{&quot;fDisplayName&quot;:&quot;Software system reset&quot;,&quot;fLaunchAttribute&quot;:&quot;system_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Hardware reset&quot;,&quot;fLaunchAttribute&quot;:&quot;hardware_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset hardware\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Core reset&quot;,&quot;fLaunchAttribute&quot;:&quot;core_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset core\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;None&quot;,&quot;fLaunchAttribute&quot;:&quot;no_reset&quot;,&quot;fGdbCommands&quot;:[],&quot;fCmdOptions&quot;:[&quot;-g&quot;]}],&quot;fGdbCommandGroup&quot;:{&quot;name&quot;:&quot;Additional commands&quot;,&quot;commands&quot;:[]},&quot;fStartApplication&quot;:true}]}"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="true"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="freertos"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverAuto" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverPort" value="cortex_m0"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverPort" value="ARM_CM0"/>
<intAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyPort" value="60000"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="false"/>
@ -73,6 +73,7 @@
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;"/>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;&gt;&lt;gdbmemoryBlockExpression address=&quot;536875216&quot; label=&quot;rxBuffer&quot;/&gt;&lt;gdbmemoryBlockExpression address=&quot;536875132&quot; label=&quot;txBuffer&quot;/&gt;&lt;/memoryBlockExpressionList&gt;"/>
<stringAttribute key="process_factory_id" value="com.st.stm32cube.ide.mcu.debug.launch.HardwareDebugProcessFactory"/>
<stringAttribute key="saved_expressions&lt;seperator&gt;Unknown" value="rxBuffer"/>
</launchConfiguration>

View file

@ -5,15 +5,6 @@ ADC.SamplingTime=ADC_SAMPLETIME_160CYCLES_5
CAD.formats=
CAD.pinconfig=
CAD.provider=
Dma.LPUART1_RX.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.LPUART1_RX.1.Instance=DMA1_Channel3
Dma.LPUART1_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.LPUART1_RX.1.MemInc=DMA_MINC_ENABLE
Dma.LPUART1_RX.1.Mode=DMA_NORMAL
Dma.LPUART1_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.LPUART1_RX.1.PeriphInc=DMA_PINC_DISABLE
Dma.LPUART1_RX.1.Priority=DMA_PRIORITY_HIGH
Dma.LPUART1_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.LPUART1_TX.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.LPUART1_TX.0.Instance=DMA1_Channel2
Dma.LPUART1_TX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
@ -24,15 +15,15 @@ Dma.LPUART1_TX.0.PeriphInc=DMA_PINC_DISABLE
Dma.LPUART1_TX.0.Priority=DMA_PRIORITY_HIGH
Dma.LPUART1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=LPUART1_TX
Dma.Request1=LPUART1_RX
Dma.RequestsNb=2
Dma.RequestsNb=1
FREERTOS.INCLUDE_pcTaskGetTaskName=1
FREERTOS.INCLUDE_xEventGroupSetBitFromISR=1
FREERTOS.INCLUDE_xTaskAbortDelay=1
FREERTOS.INCLUDE_xTaskGetCurrentTaskHandle=1
FREERTOS.INCLUDE_xTaskGetHandle=1
FREERTOS.IPParameters=Tasks01,configTICK_RATE_HZ,configUSE_TICKLESS_IDLE,INCLUDE_xTaskGetHandle,INCLUDE_xTaskAbortDelay,INCLUDE_xEventGroupSetBitFromISR,INCLUDE_pcTaskGetTaskName,INCLUDE_xTaskGetCurrentTaskHandle,configTOTAL_HEAP_SIZE,configUSE_NEWLIB_REENTRANT
FREERTOS.IPParameters=Tasks01,configTICK_RATE_HZ,configUSE_TICKLESS_IDLE,INCLUDE_xTaskGetHandle,INCLUDE_xTaskAbortDelay,INCLUDE_xEventGroupSetBitFromISR,INCLUDE_pcTaskGetTaskName,INCLUDE_xTaskGetCurrentTaskHandle,configTOTAL_HEAP_SIZE,configUSE_NEWLIB_REENTRANT,configMAX_TASK_NAME_LEN
FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configMAX_TASK_NAME_LEN=25
FREERTOS.configTICK_RATE_HZ=1000
FREERTOS.configTOTAL_HEAP_SIZE=1024
FREERTOS.configUSE_NEWLIB_REENTRANT=1
@ -41,7 +32,8 @@ File.Version=6
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
LPUART1.BaudRate=115200
LPUART1.IPParameters=BaudRate,WordLength
LPUART1.DMADisableonRxErrorParam=UART_ADVFEATURE_DMA_DISABLEONRXERROR
LPUART1.IPParameters=BaudRate,WordLength,DMADisableonRxErrorParam
LPUART1.WordLength=UART_WORDLENGTH_8B
Mcu.CPN=STM32L071CBT3
Mcu.Family=STM32L0
@ -100,7 +92,7 @@ Mcu.UserName=STM32L071CBTx
MxCube.Version=6.7.0
MxDb.Version=DB.6.0.70
NVIC.ADC1_COMP_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.DMA1_Channel2_3_IRQn=true\:3\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA1_Channel2_3_IRQn=true\:3\:0\:true\:false\:true\:true\:false\:true\:true
NVIC.EXTI2_3_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.EXTI4_15_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true
@ -115,7 +107,7 @@ NVIC.SavedSystickIrqHandlerGenerated=true
NVIC.SysTick_IRQn=true\:3\:0\:false\:false\:false\:true\:false\:true\:false
NVIC.TIM21_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true\:true
NVIC.TIM2_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true\:true
NVIC.TIM6_IRQn=true\:3\:0\:true\:false\:true\:false\:true\:true\:true
NVIC.TIM6_IRQn=true\:3\:0\:false\:false\:true\:false\:false\:true\:true
NVIC.TimeBase=TIM6_IRQn
NVIC.TimeBaseIP=TIM6
PA0.GPIOParameters=GPIO_Label
@ -126,9 +118,10 @@ PA1.GPIOParameters=GPIO_Label
PA1.GPIO_Label=ENC_PHA_GAUCHE
PA1.Locked=true
PA1.Signal=GPIO_Input
PA10.GPIOParameters=GPIO_Label
PA10.GPIOParameters=PinState,GPIO_Label
PA10.GPIO_Label=XBEE_RESET
PA10.Locked=true
PA10.PinState=GPIO_PIN_RESET
PA10.Signal=GPIO_Output
PA11.GPIOParameters=GPIO_Label
PA11.GPIO_Label=LED_SEG_F