27 #include <oc_uart_lld.h> 30 #include <oc_gpio_mslld.h> 45 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 47 #define USE_INTERRUPTS_FOR_TX false 48 #define SOFTWARE_RING_COUNT 10 49 #define IsRam(Address) (oC_LSF_IsRamAddress(Address) || oC_LSF_IsExternalAddress(Address)) 50 #define IsRom(Address) oC_LSF_IsRomAddress(Address) 51 #define IsChannelCorrect(Channel) oC_Channel_IsCorrect(UART,Channel) 52 #define IsChannelPoweredOn(Channel) (oC_Machine_GetPowerStateForChannel(Channel) == oC_Power_On) 53 #define AreOperationsDisabled(Channel) (USARTx_CR1(Channel)->UE == 0) 54 #define AreOperationsEnabled(Channel) (USARTx_CR1(Channel)->UE == 1) 55 #define USARTx_CR1(Channel) oC_Machine_Register(Channel , USARTx_CR1) 56 #define USARTx_CR2(Channel) oC_Machine_Register(Channel , USARTx_CR2) 57 #define USARTx_CR3(Channel) oC_Machine_Register(Channel , USARTx_CR3) 58 #define USARTx_BRR(Channel) oC_Machine_Register(Channel , USARTx_BRR) 59 #define USARTx_TDR(Channel) oC_Machine_Register(Channel , USARTx_TDR) 60 #define USARTx_RDR(Channel) oC_Machine_Register(Channel , USARTx_RDR) 61 #define USARTx_ISR(Channel) oC_Machine_Register(Channel , USARTx_ISR) 62 #define USARTx_ICR(Channel) oC_Machine_Register(Channel , USARTx_ICR) 63 #define TransmitDataMovedToFifo(Channel) (USARTx_ISR(Channel)->TXE == 1) 64 #define ReceiveDataAvailable(Channel) (USARTx_ISR(Channel)->RXNE == 1) 65 #define RCC_DCKCFGR2 oC_Register(RCC,RCC_DCKCFGR2) 66 #define RxRing(Channel) SoftwareRxRings[oC_Channel_ToIndex(UART,Channel)] 67 #define IsSoftwareRxRingEmpty(Channel) (RxRing(Channel).Counter == 0) 68 #define IsSoftwareRxRingFull(Channel) (RxRing(Channel).Counter == SOFTWARE_RING_COUNT) 69 #define TxRing(Channel) SoftwareTxRings[oC_Channel_ToIndex(UART,Channel)] 70 #define IsSoftwareTxRingEmpty(Channel) (TxRing(Channel).Counter == 0) 71 #define IsSoftwareTxRingFull(Channel) (TxRing(Channel).Counter == SOFTWARE_RING_COUNT) 74 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 81 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 85 uint16_t Buffer[SOFTWARE_RING_COUNT];
91 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 98 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 104 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 112 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________ 114 static oC_UART_LLD_Interrupt_t RxNotEmptyHandler =
NULL;
115 static oC_UART_LLD_Interrupt_t TxNotFullHandler =
NULL;
118 #if oC_ModuleChannel_NumberOfElements(UART) <= 8 119 static uint8_t UsedChannels = 0;
120 #elif oC_ModuleChannel_NumberOfElements(UART) <= 16 121 static uint16_t UsedChannels = 0;
122 #elif oC_ModuleChannel_NumberOfElements(UART) <= 32 123 static uint32_t UsedChannels = 0;
124 #elif oC_ModuleChannel_NumberOfElements(UART) <= 64 125 static uint64_t UsedChannels = 0;
127 # error Number of UART channels is too big (max 64) 130 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________ 137 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 145 bool oC_UART_LLD_IsChannelCorrect( oC_UART_Channel_t Channel )
156 bool oC_UART_LLD_IsChannelIndexCorrect( oC_UART_LLD_ChannelIndex_t ChannelIndex )
167 oC_UART_LLD_ChannelIndex_t oC_UART_LLD_ChannelToChannelIndex( oC_UART_Channel_t Channel )
178 oC_UART_Channel_t oC_UART_LLD_ChannelIndexToChannel( oC_UART_LLD_ChannelIndex_t Channel )
189 oC_UART_Channel_t oC_UART_LLD_GetChannelOfModulePin( oC_UART_Pin_t ModulePin )
191 return oC_ModulePin_GetChannel(ModulePin);
200 oC_ErrorCode_t oC_UART_LLD_TurnOnDriver(
void )
202 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
209 errorCode = oC_ErrorCode_None;
210 RxNotEmptyHandler =
NULL;
211 TxNotFullHandler =
NULL;
214 memset(SoftwareRxRings,0,
sizeof(SoftwareRxRings));
215 memset(SoftwareTxRings,0,
sizeof(SoftwareTxRings));
229 oC_ErrorCode_t oC_UART_LLD_TurnOffDriver(
void )
231 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
238 errorCode = oC_ErrorCode_None;
252 oC_ErrorCode_t oC_UART_LLD_SetDriverInterruptHandlers( oC_UART_LLD_Interrupt_t RxNotEmpty , oC_UART_LLD_Interrupt_t TxNotFull)
254 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
261 ErrorCondition( IsRam(RxNotEmpty) || IsRom(RxNotEmpty) , oC_ErrorCode_WrongEventHandlerAddress) &&
262 ErrorCondition( RxNotEmptyHandler ==
NULL , oC_ErrorCode_InterruptHandlerAlreadySet) &&
263 ErrorCondition( IsRam(TxNotFull) || IsRom(TxNotFull) , oC_ErrorCode_WrongEventHandlerAddress) &&
264 ErrorCondition( TxNotFullHandler ==
NULL , oC_ErrorCode_InterruptHandlerAlreadySet)
267 RxNotEmptyHandler = RxNotEmpty;
268 TxNotFullHandler = TxNotFull;
269 errorCode = oC_ErrorCode_None;
284 oC_ErrorCode_t oC_UART_LLD_SetPower( oC_UART_Channel_t Channel ,
oC_Power_t Power )
286 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
293 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
296 ErrorCondition( oC_Channel_EnableInterrupt(Channel,PeripheralInterrupt) , oC_ErrorCode_CannotEnableInterrupt)
303 RCC_DCKCFGR2->Value &= ~(0x3<<(channelIndex*2));
304 RCC_DCKCFGR2->Value |= 0x1<<(channelIndex*2);
308 errorCode = oC_ErrorCode_None;
323 oC_ErrorCode_t oC_UART_LLD_ReadPower( oC_UART_Channel_t Channel ,
oC_Power_t * outPower )
325 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
332 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
333 ErrorCondition( IsRam(outPower) , oC_ErrorCode_OutputAddressNotInRAM)
337 errorCode = oC_ErrorCode_None;
351 oC_ErrorCode_t oC_UART_LLD_DisableOperations( oC_UART_Channel_t Channel )
353 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
360 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
361 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn)
364 USARTx_CR1(Channel)->UE = 0;
365 errorCode = oC_ErrorCode_None;
380 oC_ErrorCode_t oC_UART_LLD_EnableOperations( oC_UART_Channel_t Channel )
382 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
389 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
390 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn)
393 USARTx_CR1(Channel)->UE = 1;
394 USARTx_CR1(Channel)->TE = 1;
395 USARTx_CR1(Channel)->RE = 1;
396 USARTx_CR1(Channel)->RXNEIE = 1;
397 errorCode = oC_ErrorCode_None;
412 oC_ErrorCode_t oC_UART_LLD_RestoreDefaultStateOnChannel( oC_UART_Channel_t Channel )
414 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
421 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
425 errorCode = oC_ErrorCode_None;
440 oC_ErrorCode_t oC_UART_LLD_SetWordLength( oC_UART_Channel_t Channel , oC_UART_LLD_WordLength_t WordLength )
442 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
449 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
450 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
451 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
456 case oC_UART_LLD_WordLength_5Bits:
457 errorCode = oC_ErrorCode_NotSupportedOnTargetMachine;
459 case oC_UART_LLD_WordLength_6Bits:
460 errorCode = oC_ErrorCode_NotSupportedOnTargetMachine;
462 case oC_UART_LLD_WordLength_7Bits:
463 USARTx_CR1(Channel)->M0 = 0;
464 USARTx_CR1(Channel)->M1 = 1;
465 errorCode = oC_ErrorCode_None;
467 case oC_UART_LLD_WordLength_8Bits:
468 USARTx_CR1(Channel)->M0 = 0;
469 USARTx_CR1(Channel)->M1 = 0;
470 errorCode = oC_ErrorCode_None;
472 case oC_UART_LLD_WordLength_9Bits:
473 USARTx_CR1(Channel)->M0 = 1;
474 USARTx_CR1(Channel)->M1 = 0;
482 errorCode = oC_ErrorCode_ProhibitedByArchitecture;
485 errorCode = oC_ErrorCode_WordLengthNotCorrect;
502 oC_ErrorCode_t oC_UART_LLD_ReadWordLength( oC_UART_Channel_t Channel , oC_UART_LLD_WordLength_t * outWordLength )
504 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
509 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
510 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
511 ErrorCondition( IsRam(outWordLength) , oC_ErrorCode_OutputAddressNotInRAM)
514 if( USARTx_CR1(Channel)->M0 == 0 && USARTx_CR1(Channel)->M1 == 0 )
516 *outWordLength = oC_UART_LLD_WordLength_8Bits;
517 errorCode = oC_ErrorCode_None;
519 else if( USARTx_CR1(Channel)->M0 == 0 && USARTx_CR1(Channel)->M1 == 1 )
521 *outWordLength = oC_UART_LLD_WordLength_7Bits;
522 errorCode = oC_ErrorCode_None;
524 else if( USARTx_CR1(Channel)->M0 == 1 && USARTx_CR1(Channel)->M1 == 0 )
526 *outWordLength = oC_UART_LLD_WordLength_9Bits;
527 errorCode = oC_ErrorCode_None;
531 errorCode = oC_ErrorCode_MachineCanBeDamaged;
545 oC_ErrorCode_t oC_UART_LLD_SetBitRate( oC_UART_Channel_t Channel , uint32_t BitRate )
547 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
554 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
555 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
556 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled) &&
557 ErrorCondition( BitRate > 0 , oC_ErrorCode_BitRateNotCorrect)
561 uint32_t usartDiv = (clockFrequency / BitRate);
563 if(usartDiv <= UINT16_MAX)
565 USARTx_CR1(Channel)->OVER8 = 0;
566 USARTx_BRR(Channel)->BRR = usartDiv;
567 errorCode = oC_ErrorCode_None;
571 errorCode = oC_ErrorCode_BitRateNotSupported;
587 oC_ErrorCode_t oC_UART_LLD_ReadBitRate( oC_UART_Channel_t Channel , uint32_t * outBitRate )
589 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
594 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
595 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
596 ErrorCondition( IsRam(outBitRate) , oC_ErrorCode_OutputAddressNotInRAM)
600 uint32_t usartDiv = USARTx_BRR(Channel)->BRR;
604 *outBitRate = clockFrequency / usartDiv;
611 errorCode = oC_ErrorCode_None;
624 oC_ErrorCode_t oC_UART_LLD_SetParity( oC_UART_Channel_t Channel , oC_UART_LLD_Parity_t Parity )
626 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
633 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
634 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
635 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
640 case oC_UART_LLD_Parity_None:
641 USARTx_CR1(Channel)->PCE = 0;
642 errorCode = oC_ErrorCode_None;
644 case oC_UART_LLD_Parity_Even:
645 USARTx_CR1(Channel)->PCE = 1;
646 USARTx_CR1(Channel)->PS = 0;
647 errorCode = oC_ErrorCode_None;
649 case oC_UART_LLD_Parity_Odd:
650 USARTx_CR1(Channel)->PCE = 1;
651 USARTx_CR1(Channel)->PS = 1;
652 errorCode = oC_ErrorCode_None;
655 errorCode = oC_ErrorCode_ParityNotCorrect;
672 oC_ErrorCode_t oC_UART_LLD_ReadParity( oC_UART_Channel_t Channel , oC_UART_LLD_Parity_t * outParity )
674 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
679 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
680 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
681 ErrorCondition( IsRam(outParity) , oC_ErrorCode_OutputAddressNotInRAM)
684 if(USARTx_CR1(Channel)->PCE == 0)
686 *outParity = oC_UART_LLD_Parity_None;
687 errorCode = oC_ErrorCode_None;
689 else if(USARTx_CR1(Channel)->PS == 0)
691 *outParity = oC_UART_LLD_Parity_Even;
692 errorCode = oC_ErrorCode_None;
694 else if(USARTx_CR1(Channel)->PS == 1)
696 *outParity = oC_UART_LLD_Parity_Odd;
697 errorCode = oC_ErrorCode_None;
701 errorCode = oC_ErrorCode_MachineCanBeDamaged;
715 oC_ErrorCode_t oC_UART_LLD_SetStopBit( oC_UART_Channel_t Channel , oC_UART_LLD_StopBit_t StopBit )
717 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
724 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
725 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
726 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
731 case oC_UART_LLD_StopBit_0p5Bit:
732 USARTx_CR2(Channel)->STOP = 1;
733 errorCode = oC_ErrorCode_None;
735 case oC_UART_LLD_StopBit_1Bit:
736 USARTx_CR2(Channel)->STOP = 0;
737 errorCode = oC_ErrorCode_None;
739 case oC_UART_LLD_StopBit_1p5Bits:
740 USARTx_CR2(Channel)->STOP = 3;
741 errorCode = oC_ErrorCode_None;
743 case oC_UART_LLD_StopBit_2Bits:
744 USARTx_CR2(Channel)->STOP = 2;
745 errorCode = oC_ErrorCode_None;
748 errorCode = oC_ErrorCode_StopBitNotSupported;
766 oC_ErrorCode_t oC_UART_LLD_ReadStopBit( oC_UART_Channel_t Channel , oC_UART_LLD_StopBit_t * outStopBit )
768 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
773 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
774 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
775 ErrorCondition( IsRam(outStopBit) , oC_ErrorCode_OutputAddressNotInRAM)
778 if(USARTx_CR2(Channel)->STOP == 1)
780 *outStopBit = oC_UART_LLD_StopBit_0p5Bit;
781 errorCode = oC_ErrorCode_None;
783 else if(USARTx_CR2(Channel)->STOP == 0)
785 *outStopBit = oC_UART_LLD_StopBit_1Bit;
786 errorCode = oC_ErrorCode_None;
788 else if(USARTx_CR2(Channel)->STOP == 3)
790 *outStopBit = oC_UART_LLD_StopBit_1p5Bits;
791 errorCode = oC_ErrorCode_None;
793 else if(USARTx_CR2(Channel)->STOP == 2)
795 *outStopBit = oC_UART_LLD_StopBit_2Bits;
796 errorCode = oC_ErrorCode_None;
800 errorCode = oC_ErrorCode_MachineCanBeDamaged;
814 oC_ErrorCode_t oC_UART_LLD_SetBitOrder( oC_UART_Channel_t Channel , oC_UART_LLD_BitOrder_t BitOrder )
816 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
823 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
824 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
825 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
830 case oC_UART_LLD_BitOrder_LSBFirst:
831 USARTx_CR2(Channel)->MSBFIRST = 0;
832 errorCode = oC_ErrorCode_None;
834 case oC_UART_LLD_BitOrder_MSBFirst:
835 USARTx_CR2(Channel)->MSBFIRST = 1;
836 errorCode = oC_ErrorCode_None;
839 errorCode = oC_ErrorCode_BitOrderNotSupported;
856 oC_ErrorCode_t oC_UART_LLD_ReadBitOrder( oC_UART_Channel_t Channel , oC_UART_LLD_BitOrder_t * outBitOrder )
858 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
863 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
864 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
865 ErrorCondition( IsRam(outBitOrder) , oC_ErrorCode_OutputAddressNotInRAM)
868 if(USARTx_CR2(Channel)->MSBFIRST == 0)
870 *outBitOrder= oC_UART_LLD_BitOrder_LSBFirst;
871 errorCode = oC_ErrorCode_None;
873 else if(USARTx_CR2(Channel)->MSBFIRST == 1)
875 *outBitOrder= oC_UART_LLD_BitOrder_MSBFirst;
876 errorCode = oC_ErrorCode_None;
880 errorCode = oC_ErrorCode_MachineCanBeDamaged;
894 oC_ErrorCode_t oC_UART_LLD_SetInvert( oC_UART_Channel_t Channel , oC_UART_LLD_Invert_t Invert )
896 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
903 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
904 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
905 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
908 if(Invert == oC_UART_LLD_Invert_Inverted)
910 USARTx_CR2(Channel)->TXINV = 1;
911 USARTx_CR2(Channel)->RXINV = 1;
912 errorCode = oC_ErrorCode_None;
914 else if(Invert == oC_UART_LLD_Invert_NotInverted)
916 USARTx_CR2(Channel)->TXINV = 0;
917 USARTx_CR2(Channel)->RXINV = 0;
918 errorCode = oC_ErrorCode_None;
922 errorCode = oC_ErrorCode_InvertNotSupported;
938 oC_ErrorCode_t oC_UART_LLD_ReadInvert( oC_UART_Channel_t Channel , oC_UART_LLD_Invert_t * outInvert )
940 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
945 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
946 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
947 ErrorCondition( IsRam(outInvert) , oC_ErrorCode_OutputAddressNotInRAM)
950 if(USARTx_CR2(Channel)->TXINV == 0 && USARTx_CR2(Channel)->RXINV == 0)
952 *outInvert = oC_UART_LLD_Invert_NotInverted;
953 errorCode = oC_ErrorCode_None;
955 else if(USARTx_CR2(Channel)->TXINV == 1 && USARTx_CR2(Channel)->RXINV == 1)
957 *outInvert = oC_UART_LLD_Invert_Inverted;
958 errorCode = oC_ErrorCode_None;
962 errorCode = oC_ErrorCode_MachineCanBeDamaged;
976 oC_ErrorCode_t oC_UART_LLD_SetLoopback( oC_UART_Channel_t Channel ,
bool Loopback )
978 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
985 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
986 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
987 ErrorCondition( AreOperationsDisabled(Channel) , oC_ErrorCode_ChannelOperationsNotDisabled)
992 errorCode = oC_ErrorCode_None;
996 errorCode = oC_ErrorCode_LoopbackNotSupported;
1012 oC_ErrorCode_t oC_UART_LLD_ReadLoopback( oC_UART_Channel_t Channel ,
bool * outLoopback )
1014 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1019 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
1020 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
1021 ErrorCondition( IsRam(outLoopback) , oC_ErrorCode_OutputAddressNotInRAM)
1024 *outLoopback =
false;
1025 errorCode = oC_ErrorCode_None;
1038 oC_ErrorCode_t oC_UART_LLD_ConnectModulePin( oC_UART_Pin_t ModulePin )
1040 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1044 oC_UART_Channel_t channel = oC_ModulePin_GetChannel(ModulePin);
1045 oC_Pin_t pin = oC_ModulePin_GetPin(ModulePin);
1048 ErrorCondition( IsChannelCorrect(channel) , oC_ErrorCode_WrongChannel ) &&
1049 ErrorCondition( oC_GPIO_LLD_IsPinDefined(pin) , oC_ErrorCode_PinNotDefined )
1052 bool unused =
false;
1057 oC_AssignErrorCode(&errorCode , oC_GPIO_LLD_ArePinsUnused(pin,&unused) ) &&
1058 ErrorCondition( unused , oC_ErrorCode_PinIsUsed ) &&
1059 oC_AssignErrorCode(&errorCode , oC_GPIO_LLD_SetPinsUsed(pin) ) &&
1060 oC_AssignErrorCode(&errorCode , oC_GPIO_MSLLD_ConnectModulePin(ModulePin) )
1063 errorCode = oC_ErrorCode_None;
1067 oC_GPIO_LLD_SetPinsUnused(pin);
1083 oC_ErrorCode_t oC_UART_LLD_DisconnectModulePin( oC_UART_Pin_t ModulePin )
1085 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1089 oC_UART_Channel_t channel = oC_ModulePin_GetChannel(ModulePin);
1090 oC_Pin_t pin = oC_ModulePin_GetPin(ModulePin);
1093 ErrorCondition( IsChannelCorrect(channel) , oC_ErrorCode_WrongChannel ) &&
1094 ErrorCondition( oC_GPIO_LLD_IsPinDefined(pin) , oC_ErrorCode_PinNotDefined )
1100 oC_AssignErrorCode(&errorCode , oC_GPIO_LLD_SetPinsUnused(pin) ) &&
1101 oC_AssignErrorCode(&errorCode , oC_GPIO_MSLLD_DisconnectModulePin(ModulePin) )
1104 errorCode = oC_ErrorCode_None;
1120 oC_ErrorCode_t oC_UART_LLD_SetChannelUsed( oC_UART_Channel_t Channel )
1122 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1128 if( ErrorCondition(IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) )
1131 errorCode = oC_ErrorCode_None;
1146 oC_ErrorCode_t oC_UART_LLD_SetChannelUnused( oC_UART_Channel_t Channel )
1148 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1154 if( ErrorCondition(IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) )
1157 errorCode = oC_ErrorCode_None;
1172 bool oC_UART_LLD_IsChannelUsed( oC_UART_Channel_t Channel )
1178 if(IsChannelCorrect(Channel))
1193 oC_ErrorCode_t oC_UART_LLD_ReadModulePinsOfPin( oC_Pin_t Pin , oC_UART_Pin_t * outModulePinsArray , uint32_t * ArraySize , oC_UART_PinFunction_t PinFunction )
1195 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1201 ErrorCondition( oC_GPIO_LLD_IsPinDefined(Pin) , oC_ErrorCode_PinNotDefined) &&
1202 ErrorCondition( IsRam(ArraySize) , oC_ErrorCode_OutputAddressNotInRAM) &&
1203 ErrorCondition(outModulePinsArray ==
NULL || IsRam(outModulePinsArray) , oC_ErrorCode_OutputAddressNotInRAM)
1206 uint32_t foundPins = 0;
1208 errorCode = oC_ErrorCode_None;
1210 oC_ModulePin_ForeachDefined(modulePin)
1212 if(modulePin->Pin == Pin &&
oC_Channel_IsCorrect(UART,modulePin->Channel) && modulePin->PinFunction == PinFunction)
1214 if(outModulePinsArray !=
NULL)
1216 if(foundPins < *ArraySize)
1218 outModulePinsArray[foundPins] = modulePin->ModulePinIndex;
1222 errorCode = oC_ErrorCode_OutputArrayToSmall;
1229 *ArraySize = foundPins;
1238 oC_ErrorCode_t oC_UART_LLD_ClearRxFifo( oC_UART_Channel_t Channel )
1240 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1244 ClearSoftwareRing(&RxRing(Channel));
1245 errorCode = oC_ErrorCode_None;
1257 bool oC_UART_LLD_IsTxFifoFull( oC_UART_Channel_t Channel )
1259 #if USE_INTERRUPTS_FOR_TX 1260 return IsSoftwareTxRingFull(Channel);
1272 bool oC_UART_LLD_IsRxFifoEmpty( oC_UART_Channel_t Channel )
1274 return IsSoftwareRxRingEmpty(Channel);
1283 void oC_UART_LLD_PutData( oC_UART_Channel_t Channel ,
char Data )
1285 #if USE_INTERRUPTS_FOR_TX 1287 USARTx_CR1(Channel)->TCIE = 1;
1289 if(IsSoftwareTxRingEmpty(Channel) && TransmitDataMovedToFifo(Channel))
1291 USARTx_TDR(Channel)->TDR = Data;
1299 while(TransmitDataMovedToFifo(Channel) !=
true);
1300 USARTx_TDR(Channel)->TDR = Data;
1310 char oC_UART_LLD_GetData( oC_UART_Channel_t Channel )
1321 oC_ErrorCode_t oC_UART_LLD_WriteWithDma( oC_UART_Channel_t Channel ,
const char * Buffer , oC_UInt_t Size )
1323 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1328 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
1329 ErrorCondition( IsRam(Buffer) || IsRom(Buffer) , oC_ErrorCode_WrongAddress) &&
1330 ErrorCondition( Size > 0 , oC_ErrorCode_SizeNotCorrect) &&
1331 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
1332 ErrorCondition( AreOperationsEnabled(Channel) , oC_ErrorCode_ChannelOperationsNotEnabled)
1335 errorCode = oC_ErrorCode_NotImplemented;
1348 oC_ErrorCode_t oC_UART_LLD_ReadWithDma( oC_UART_Channel_t Channel ,
char * outBuffer , oC_UInt_t Size )
1350 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1355 ErrorCondition( IsChannelCorrect(Channel) , oC_ErrorCode_WrongChannel) &&
1356 ErrorCondition( IsRam(outBuffer) , oC_ErrorCode_OutputAddressNotInRAM) &&
1357 ErrorCondition( Size > 0 , oC_ErrorCode_SizeNotCorrect) &&
1358 ErrorCondition( IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn) &&
1359 ErrorCondition( AreOperationsEnabled(Channel) , oC_ErrorCode_ChannelOperationsNotEnabled)
1362 errorCode = oC_ErrorCode_NotImplemented;
1369 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 1376 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 1385 if(Ring->Counter >= SOFTWARE_RING_COUNT)
1391 Ring->Buffer[Ring->PutIndex++] = Data;
1394 if(Ring->PutIndex >= SOFTWARE_RING_COUNT)
1407 uint16_t data = 0xFFFF;
1409 if(Ring->Counter > 0)
1412 data = Ring->Buffer[Ring->GetIndex++];
1413 if(Ring->GetIndex >= SOFTWARE_RING_COUNT)
1432 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 1440 #define _________________________________________INTERRUPTS_SECTION_________________________________________________________________________ 1442 #define MODULE_NAME UART 1443 #define INTERRUPT_TYPE_NAME PeripheralInterrupt 1452 if(USARTx_ISR(Channel)->TC == 1)
1454 while(IsSoftwareTxRingEmpty(Channel) ==
false && (TransmitDataMovedToFifo(Channel)))
1459 if(TxNotFullHandler)
1461 TxNotFullHandler(Channel);
1464 if(IsSoftwareTxRingEmpty(Channel))
1466 USARTx_CR1(Channel)->TCIE = 0;
1470 if(USARTx_ISR(Channel)->RXNE == 1)
1472 while(ReceiveDataAvailable(Channel))
1477 if(RxNotEmptyHandler)
1479 RxNotEmptyHandler(Channel);
1483 USARTx_ICR(Channel)->Value = 0x21B5F;
1486 #undef _________________________________________INTERRUPTS_SECTION_________________________________________________________________________
double oC_Frequency_t
type to store frequency
The file contains definitions for the compiler, that helps to manage errors, etc. ...
The file with interface for LSF module.
The file with LLD interface for the MEM driver.
The file with interface for the module library.
oC_Frequency_t oC_CLOCK_LLD_GetClockFrequency(void)
returns frequency of the system clock
static bool oC_Module_IsTurnedOn(oC_Module_t Module)
checks if the module is turned on
Something is powered off.
The file with LLD interface for the CLOCK driver.
oC_Channel_t
stores machine channel
#define oC_Channel_IsCorrect(MODULE_NAME, Channel)
checks if channel is correct
#define oC_Channel_FromIndex(MODULE_NAME, ChannelIndex)
returns channel according to index in module
#define oC_ModuleChannel_NumberOfElements(MODULE_NAME)
Number of elements in module channel.
static void oC_Module_TurnOn(oC_Module_t Module)
sets module as turned on
The file with functions for the bits operation.
static void oC_MCS_EnterCriticalSection(void)
Enters to critical section.
Static array definitions.
static void PutToSoftwareRing(SoftwareRing_t *SoftwareRing, oC_Netif_t Netif, oC_Net_Packet_t *Packet)
puts packet to the software ring
static oC_Power_t oC_Machine_GetPowerStateForChannel(oC_Channel_t Channel)
returns power state for channel
static bool oC_Module_TurnOffVerification(oC_ErrorCode_t *outErrorCode, oC_Module_t Module)
verify if module is turned off
static bool oC_MCS_ExitCriticalSection(void)
Exits from critical section.
static bool oC_Module_TurnOnVerification(oC_ErrorCode_t *outErrorCode, oC_Module_t Module)
verify if module is turned on
#define oC_Channel_ToIndex(MODULE_NAME, Channel)
returns index in module according to channel
The file with LLD interface for the DMA driver.
static bool GetFromSoftwareRing(SoftwareRing_t *SoftwareRing, const oC_Net_Address_t *Address, oC_Net_Packet_t *outPacket, oC_Netif_t *outNetif, oC_NetifMan_PacketFilterFunction_t FilterFunction, const void *Parameter)
reads packet from the software ring
#define oC_Channel_InterruptHandler(ChannelVariableName)
creates common interrupt handler for channel
static bool oC_Machine_SetPowerStateForChannel(oC_Channel_t Channel, oC_Power_t Power)
configures power state for machine channel
oC_Power_t
stores registers power state
The most important interrupt priority, that is possible in the machine.
#define NULL
pointer to a zero
static void oC_Module_TurnOff(oC_Module_t Module)
sets module as turned off