Added remote(int) and initRemote functions. remote is linked to the interruption for USART 1 and is called everytime we receive a data.
This commit is contained in:
parent
820a3db260
commit
d9a4ae852d
6 changed files with 78 additions and 111 deletions
115
driver/uart.c
115
driver/uart.c
|
@ -2,30 +2,11 @@
|
|||
#include "gpio.h"
|
||||
//faire GPIO
|
||||
|
||||
char data1 = 0;
|
||||
char data2 = 0;
|
||||
char data3 = 0;
|
||||
void (* pFncUART) (uint16_t data); /* d<>claration d<>un pointeur de fonction */
|
||||
|
||||
void MyUART_Init(MyUART_Struct_Typedef * UARTStructPtr){
|
||||
MyUART_setClockBit(UARTStructPtr); //Clock enable and setting the baud.
|
||||
UARTStructPtr->UART->CR1 = 0x00; // Clear ALL
|
||||
UARTStructPtr->UART->CR1 |= USART_CR1_UE;
|
||||
UARTStructPtr->UART->CR1 |= ((UARTStructPtr->length)<<12); //Setting the Length of the data transmitted
|
||||
|
||||
UARTStructPtr->UART->CR1 &= ~(0x3<<9); //reset CR1 9-10 bits, Parity Selection
|
||||
if(UARTStructPtr->parity != parityNone) //if parity is enabled
|
||||
{
|
||||
UARTStructPtr->UART->CR1 |= (UARTStructPtr->parity<<9); //depending on the parity changing the 9th bit, and set 10th bit to 1
|
||||
}
|
||||
|
||||
UARTStructPtr->UART->CR2 &= ~(0x3<<12); //reset CR2 13-12 bits, Stop bits
|
||||
if(UARTStructPtr->stop != stopBit1) //if stop bits > 1
|
||||
{
|
||||
UARTStructPtr->UART->CR2 |= (UARTStructPtr->stop<<12); //depending on the stop changing the 12th and 13th bit.
|
||||
}
|
||||
//TxD Enable, RxD Enable, USART Global Enable
|
||||
UARTStructPtr->UART->CR1 |= (USART_CR1_TE | USART_CR1_RE);
|
||||
MyUART_ActiveIT(UARTStructPtr->UART,1);
|
||||
void MyUART_Init_Periph (void (* ptrFonction)(uint16_t))
|
||||
{
|
||||
pFncUART = ptrFonction; /* affectation du pointeur */
|
||||
}
|
||||
|
||||
int MyUART_setClockBit(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
|
@ -53,6 +34,25 @@ int MyUART_setClockBit(MyUART_Struct_Typedef * UARTStructPtr)
|
|||
}
|
||||
}
|
||||
|
||||
uint8_t MyUART_GetInterruptNum(USART_TypeDef * UART)
|
||||
{
|
||||
if(UART == USART1)
|
||||
{
|
||||
return USART1_IRQn;
|
||||
}
|
||||
else if(UART == USART2)
|
||||
{
|
||||
return USART2_IRQn;
|
||||
}
|
||||
else if(UART == USART3)
|
||||
{
|
||||
return USART3_IRQn;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void MyUART_ActiveIT(USART_TypeDef * UART, uint8_t Prio)
|
||||
{
|
||||
uint32_t IRQNumber = MyUART_GetInterruptNum(UART);
|
||||
|
@ -61,6 +61,28 @@ void MyUART_ActiveIT(USART_TypeDef * UART, uint8_t Prio)
|
|||
NVIC->ISER[1] |= (0x1<<(IRQNumber-32)); //Active l'interruption au niveau NVIC (p.119 manuel programming pour ISER[0])
|
||||
}
|
||||
|
||||
void MyUART_Init(MyUART_Struct_Typedef * UARTStructPtr){
|
||||
MyUART_setClockBit(UARTStructPtr); //Clock enable and setting the baud.
|
||||
UARTStructPtr->UART->CR1 = 0x00; // Clear ALL
|
||||
UARTStructPtr->UART->CR1 |= USART_CR1_UE;
|
||||
UARTStructPtr->UART->CR1 |= ((UARTStructPtr->length)<<12); //Setting the Length of the data transmitted
|
||||
|
||||
UARTStructPtr->UART->CR1 &= ~(0x3<<9); //reset CR1 9-10 bits, Parity Selection
|
||||
if(UARTStructPtr->parity != parityNone) //if parity is enabled
|
||||
{
|
||||
UARTStructPtr->UART->CR1 |= (UARTStructPtr->parity<<9); //depending on the parity changing the 9th bit, and set 10th bit to 1
|
||||
}
|
||||
|
||||
UARTStructPtr->UART->CR2 &= ~(0x3<<12); //reset CR2 13-12 bits, Stop bits
|
||||
if(UARTStructPtr->stop != stopBit1) //if stop bits > 1
|
||||
{
|
||||
UARTStructPtr->UART->CR2 |= (UARTStructPtr->stop<<12); //depending on the stop changing the 12th and 13th bit.
|
||||
}
|
||||
//TxD Enable, RxD Enable, USART Global Enable
|
||||
UARTStructPtr->UART->CR1 |= (USART_CR1_TE | USART_CR1_RE);
|
||||
MyUART_ActiveIT(UARTStructPtr->UART,1);
|
||||
}
|
||||
|
||||
void MyUART_InitGPIO(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
{
|
||||
MyGPIO_Struct_TypeDef rxd,txd;
|
||||
|
@ -87,8 +109,8 @@ void MyUART_InitGPIO(MyUART_Struct_Typedef * UARTStructPtr)
|
|||
void MyUART_Send(MyUART_Struct_Typedef *UART, uint8_t data)
|
||||
{
|
||||
UART->UART->DR = data;
|
||||
//du DR au Registre de Transmission, on attend que le bit de stop soit envoyé
|
||||
while (!(UART->UART->SR & USART_SR_TC));
|
||||
//du DR au Registre de Transmission, on attend que le shift register ai récupéré le DR
|
||||
while (!(UART->UART->SR & USART_SR_TXE));
|
||||
}
|
||||
|
||||
uint8_t MyUART_Receive(MyUART_Struct_Typedef *UART)
|
||||
|
@ -99,30 +121,12 @@ uint8_t MyUART_Receive(MyUART_Struct_Typedef *UART)
|
|||
return data;
|
||||
}
|
||||
|
||||
uint8_t MyUART_GetInterruptNum(USART_TypeDef * UART)
|
||||
{
|
||||
if(UART == USART1)
|
||||
{
|
||||
return USART1_IRQn;
|
||||
}
|
||||
else if(UART == USART2)
|
||||
{
|
||||
return USART2_IRQn;
|
||||
}
|
||||
else if(UART == USART3)
|
||||
{
|
||||
return USART3_IRQn;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
if((USART1->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
data1 = USART1->DR; // read received data
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART1->DR); /* appel indirect de la fonction */
|
||||
USART1->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
@ -131,7 +135,8 @@ void USART2_IRQHandler(void)
|
|||
{
|
||||
if((USART2->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
data2 = USART2->DR; // read received data
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART2->DR); /* appel indirect de la fonction */
|
||||
USART2->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
@ -141,26 +146,12 @@ void USART3_IRQHandler(void)
|
|||
// Check if receive data register not empty
|
||||
if((USART3->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
data3 = USART3->DR; // read received data
|
||||
// do something with received data
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART3->DR); /* appel indirect de la fonction */
|
||||
USART2->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
char MyUART_Read(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
{
|
||||
if(UARTStructPtr->UART == USART1)
|
||||
return data1;
|
||||
else if(UARTStructPtr->UART == USART2)
|
||||
return data2;
|
||||
else if(UARTStructPtr->UART == USART3)
|
||||
return data3;
|
||||
else
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
/* exemple utilisation fonction :
|
||||
|
||||
UART1.UART = USART1; // choix UART (USART1, USART2, USART3)
|
||||
|
|
|
@ -30,10 +30,7 @@ typedef struct {
|
|||
|
||||
void MyUART_Init(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
void MyUART_InitGPIO(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
int MyUART_setClockBit(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
void MyUART_Send(MyUART_Struct_Typedef *UART, uint8_t data);
|
||||
uint8_t MyUART_Receive(MyUART_Struct_Typedef *UART);
|
||||
void MyUART_ActiveIT(USART_TypeDef * UART, uint8_t Prio);
|
||||
uint8_t MyUART_GetInterruptNum(USART_TypeDef * UART);
|
||||
char MyUART_Read(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
void MyUART_Init_Periph (void (* ptrFonction)(uint16_t));
|
||||
#endif
|
||||
|
|
|
@ -1 +1,18 @@
|
|||
#include "remote.h"
|
||||
#include "../driver/gpio.h"
|
||||
|
||||
MyUART_Struct_Typedef uartCool = {USART1,9600,lengthBit8,parityNone,stopBit1};
|
||||
|
||||
void remote(uint16_t data)
|
||||
{
|
||||
//MyGPIO_Set(GPIOA,5);
|
||||
MyUART_Send(&uartCool,data);
|
||||
}
|
||||
|
||||
void initRemote(void)
|
||||
{
|
||||
MyUART_InitGPIO(&uartCool);
|
||||
MyUART_Init(&uartCool);
|
||||
MyUART_Init_Periph(remote);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,4 +4,7 @@
|
|||
|
||||
//XBEE 9600 baud, zero parite, 1 bit de stop,
|
||||
|
||||
void remote(uint16_t data);
|
||||
void initRemote(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,20 +6,11 @@
|
|||
|
||||
int main (void)
|
||||
{
|
||||
//MyGPIO_Struct_TypeDef led = {GPIOA,5,Out_PullUp}; //led
|
||||
//MyGPIO_Init(&led); //test des leds pour ignorer les contraintes liées aux différents ports
|
||||
MyGPIO_Struct_TypeDef led = {GPIOA,5,Out_PullUp}; //led
|
||||
MyGPIO_Init(&led); //test des leds pour ignorer les contraintes liées aux différents ports
|
||||
|
||||
MyUART_Struct_Typedef uartCool = {USART2,9600,lengthBit8,parityNone,stopBit1};
|
||||
|
||||
MyUART_InitGPIO(&uartCool);
|
||||
MyUART_Init(&uartCool);
|
||||
initRemote();
|
||||
|
||||
while(1){
|
||||
if(MyUART_Read(&uartCool) == 0x61)
|
||||
{
|
||||
MyGPIO_Set(GPIOA,5);
|
||||
MyUART_Send(&uartCool,'o');
|
||||
MyUART_Send(&uartCool,'k');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -436,39 +436,7 @@
|
|||
<Bp>
|
||||
<Number>3</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>17</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>.\Source\Principale.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>4</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>19</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>.\Source\Principale.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>5</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>20</LineNumber>
|
||||
<LineNumber>14</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
|
|
Loading…
Reference in a new issue