105 #define I2C_CLK_TIMING_DEFAULT 0x00A00D26 // Refer to STM AN4235 --> 0x00800D22 0x00A00D26
106 #define I2C_TIMEOUT_DEFAULT 50 // Number of tries for a flag (5000)
107 #define I2C_SCL_PIN GPIO_Pin_7 // SCL pin
108 #define I2C_SDA_PIN GPIO_Pin_6 // SDA pin
109 #define I2C_SCL_SRC GPIO_PinSource7 // SCL pin
110 #define I2C_SDA_SRC GPIO_PinSource6 // SDA pin
111 #define I2C_PORT GPIOB // PORT B
152 GPIOOType_TypeDef Output_Type, GPIOSpeed_TypeDef Speed,
153 GPIOPuPd_TypeDef PuPd, GPIO_TypeDef* GPIOx);
177 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
197 GPIO_structure_init(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12,
255 GPIO_InitTypeDef GPIO_InitState;
256 USART_InitTypeDef USART_InitStruct ;
257 USART_ClockInitTypeDef USART_InitClockStruct;
258 NVIC_InitTypeDef NVIC_InitStructure ;
261 RCC->CFGR = 0x0034000A;
262 SYSCFG->CFGR1 |= (uint32_t)0x100000;
263 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
264 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
266 GPIO_InitState.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_15 ;
267 GPIO_InitState.GPIO_Mode = GPIO_Mode_AF ;
268 GPIO_InitState.GPIO_Speed = GPIO_Speed_10MHz ;
269 GPIO_InitState.GPIO_OType = GPIO_OType_PP ;
270 GPIO_InitState.GPIO_PuPd = GPIO_PuPd_NOPULL ;
271 GPIO_Init(GPIOA,&GPIO_InitState) ;
272 GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_7);
273 GPIO_PinAFConfig(GPIOA,GPIO_PinSource2 ,GPIO_AF_7);
275 USART_DeInit(USART2);
276 USART_StructInit(&USART_InitStruct);
277 USART_ClockStructInit(&USART_InitClockStruct);
278 USART_InitStruct.USART_BaudRate = 921600;
279 USART_ClockInit(USART2,&USART_InitClockStruct);
280 USART_Init(USART2,&USART_InitStruct) ;
281 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE) ;
284 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
285 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
286 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
287 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
288 NVIC_Init(&NVIC_InitStructure);
289 NVIC_EnableIRQ(USART2_IRQn);
290 USART_Cmd(USART2,ENABLE) ;
303 RCC_ClocksTypeDef RCC_Clocks;
304 RCC_GetClocksFreq(&RCC_Clocks);
305 (void) SysTick_Config(RCC_Clocks.HCLK_Frequency / frequency);
315 if (
ticks < UINT32_MAX )
373 #define CLOCK_CYCLES_PER_INSTRUCTION 1
374 #define CLOCK_FREQ 72 //IN MHZ (e.g. 16 for 16 MHZ)
375 for (
int i=0; i<time_us; ++i)
398 end = start + time_ms;
453 GPIOMode_TypeDef GPIO_Mode,
454 GPIOOType_TypeDef Output_Type,
455 GPIOSpeed_TypeDef Speed,
456 GPIOPuPd_TypeDef PuPd,
460 GPIO_InitTypeDef my_GPIO_Struc;
464 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
468 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
471 my_GPIO_Struc.GPIO_Pin = GPIO_Pin_x;
472 my_GPIO_Struc.GPIO_Mode = GPIO_Mode;
473 my_GPIO_Struc.GPIO_OType = Output_Type;
474 my_GPIO_Struc.GPIO_Speed = Speed;
475 my_GPIO_Struc.GPIO_PuPd = PuPd;
477 GPIO_Init(GPIOx, &my_GPIO_Struc);
506 uint16_t GPIO_Pin = 1 << pin;
507 uint8_t INT_pin_status = 0x00;
520 INT_pin_status = (0 == GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)) ? 1 : 0;
521 return INT_pin_status;
537 uint16_t GPIO_Pin = 1<<pin;
551 BitVal = (value == 0) ? Bit_RESET : Bit_SET;
554 GPIO_SetBits(GPIOx,GPIO_Pin) ;
558 GPIO_ResetBits(GPIOx,GPIO_Pin) ;
616 I2C_InitTypeDef I2C_InitStructure = {0};
624 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
625 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
627 GPIO_PinAFConfig(External_Config->
GPIOx, External_Config->
SCL_Src, GPIO_AF_4);
628 GPIO_PinAFConfig(External_Config->
GPIOx, External_Config->
SDA_Src, GPIO_AF_4);
631 I2C_SoftwareResetCmd(I2C1);
634 I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Disable;
635 I2C_InitStructure.I2C_DigitalFilter = 0x00;
636 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
637 I2C_InitStructure.I2C_OwnAddress1 = 0x00;
638 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
639 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
641 I2C_Init(I2C1, &I2C_InitStructure);
643 SYSCFG_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus_I2C1, ENABLE);
644 I2C_Cmd(I2C1, ENABLE);
679 uint8_t
i2c_Write(uint8_t DeviceAddr ,uint8_t Command, uint8_t* pBuffer, uint8_t len)
683 uint32_t counter = 0;
692 while (I2C_GetFlagStatus(I2C1, I2C_ISR_BUSY) != RESET)
694 if ((--timeout) == 0)
701 I2C_Cmd(I2C1, DISABLE);
702 I2C_Cmd(I2C1, ENABLE);
704 I2C_TransferHandling(I2C1, ((DeviceAddr& 0x7f) << 1),(len+1), I2C_AutoEnd_Mode, I2C_Generate_Start_Write);
707 while (I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET)
709 if ((--timeout) == 0)
716 I2C_SendData(I2C1, Command);
718 while (counter < len)
722 while (I2C_GetFlagStatus(I2C1, I2C_ISR_TXE) == RESET)
724 if ((--timeout) == 0)
731 I2C_SendData(I2C1, pBuffer[counter]);
736 while (I2C_GetFlagStatus(I2C1, I2C_ISR_TXE) == RESET)
738 if ((--timeout) == 0)
745 I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
770 uint8_t
i2c_Read(uint8_t DeviceAddr,uint8_t Command, uint8_t* pBuffer, uint16_t len)
782 while (I2C_GetFlagStatus(I2C1, I2C_ISR_BUSY) != RESET)
784 if ((--timeout) == 0)
791 I2C_TransferHandling(I2C1, (DeviceAddr << 1), 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
794 while (I2C_GetFlagStatus(I2C1, I2C_ISR_TXE) == RESET)
796 if ((--timeout) == 0)
803 I2C_SendData(I2C1, Command);
806 while (I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET)
808 if ((--timeout) == 0)
815 I2C_TransferHandling(I2C1, (DeviceAddr << 1), len, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
821 while (I2C_GetFlagStatus(I2C1, I2C_ISR_RXNE) == RESET)
823 if ((--timeout) == 0)
830 *pBuffer = I2C_ReceiveData(I2C1);
838 while (I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET)
840 if ((--timeout) == 0)
847 I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
879 EXTI_InitTypeDef EXTI_InitStructure;
880 NVIC_InitTypeDef NVIC_InitStructure;
882 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
884 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource4);
887 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
888 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
889 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
890 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
891 NVIC_Init(&NVIC_InitStructure);
892 NVIC_EnableIRQ(EXTI4_IRQn);
895 EXTI_InitStructure.EXTI_Line = EXTI_Line4;
896 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
897 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
898 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
899 EXTI_Init(&EXTI_InitStructure);
907 EXTI_InitTypeDef EXTI_InitStructure;
908 NVIC_InitTypeDef NVIC_InitStructure;
910 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
912 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource5);
914 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource6);
916 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource7);
919 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
920 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
921 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
922 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
923 NVIC_Init(&NVIC_InitStructure);
924 NVIC_EnableIRQ(EXTI9_5_IRQn);
927 EXTI_InitStructure.EXTI_Line = EXTI_Line5;
928 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
929 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
930 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
931 EXTI_Init(&EXTI_InitStructure);
932 EXTI_InitStructure.EXTI_Line = EXTI_Line6;
933 EXTI_Init(&EXTI_InitStructure);
934 EXTI_InitStructure.EXTI_Line = EXTI_Line7;
935 EXTI_Init(&EXTI_InitStructure);
977 if(EXTI_GetITStatus(EXTI_Line4) != RESET)
983 (*EXTI_Callback_Fn)();
987 EXTI_ClearITPendingBit(EXTI_Line4);
995 if((EXTI_GetITStatus(EXTI_Line7) != RESET))
1001 (*EXTI_Callback_Fn)();
1005 EXTI_ClearITPendingBit(EXTI_Line7);
1007 if((EXTI_GetITStatus(EXTI_Line6) != RESET))
1013 (*EXTI_Callback_Fn)();
1017 EXTI_ClearITPendingBit(EXTI_Line6);
1019 if((EXTI_GetITStatus(EXTI_Line5) != RESET))
1025 (*EXTI_Callback_Fn)();
1029 EXTI_ClearITPendingBit(EXTI_Line5);
1039 uint8_t op_result = 0;
1061 while(!(USARTx->ISR & USART_ISR_TXE));
1084 char value[10] = {0};
1088 value[i] = (char)(number % 10) +
'0';
1163 if(USART_GetITStatus(USART2 , USART_IT_RXNE) != RESET)
1167 (*USARTCallback_Rx_Fn)();
1171 if(USART_GetITStatus(USART2 , USART_IT_TXE) != RESET)
1175 (*USARTCallback_Tx_Fn)();
1195 va_start(args, format);
1196 vsprintf(buf, format, args);
1213 channel_saturation);
1221 #define PACKET_SIZE 19
1222 #define SATURATION_MASK 0x80
1223 #define SATURATION_FLAG(CH,POS) ((CH & SATURATION_MASK) >> (7 - POS))
1225 uint8_t index_data = 3, index_DataS =0;
1229 for(uint8_t channel=0; channel < 4; ++ channel)
1231 data[index_data++] = DataS[index_DataS ++]& 0x7f;
1232 data[index_data++] = DataS[index_DataS ++];
1233 data[index_data++] = DataS[index_DataS ++];
1236 data[index_data++] = DataS[index_DataS++];
1237 data[index_data++] = DataS[index_DataS++];
1244 for(uint8_t index_packet=0; index_packet <
PACKET_SIZE; ++index_packet)
1271 GPIO_SetBits(GPIOA, GPIO_Pin_3);
1278 #define LED_RUN_ON GPIO_ResetBits(GPIOA,GPIO_Pin_1);
1279 #define LED_RUN_OFF GPIO_SetBits(GPIOA,GPIO_Pin_1);
1294 #define LED_READY_ON GPIO_ResetBits(GPIOA,GPIO_Pin_0) ;
1295 #define LED_READY_OFF GPIO_SetBits(GPIOA,GPIO_Pin_0) ;
1324 GPIO_ResetBits(GPIOB,1) ;
1340 if ( 2 == *EmitterStatus )
1342 GPIO_SetBits(GPIOB,GPIO_Pin_0) ;
1344 *EmitterStatus = 0x06 ;
1348 GPIO_ResetBits(GPIOB,GPIO_Pin_0) ;
1350 *EmitterStatus = 0x0A ;
1356 static void Emitter_toggle(uint8_t *EmitterStatus, uint8_t EmitterONTime, uint8_t EmitterOFFTime)
1358 if ( 4 == ( *EmitterStatus & 0x04 ) )
1360 GPIO_ResetBits(GPIOB, GPIO_Pin_0) ;
1365 GPIO_SetBits(GPIOB, GPIO_Pin_0) ;
1374 if ( ( 2 == ( *EmitterStatus & 0xA ) ) && ( 0 ==
EmitterTimer ) )
1377 *EmitterStatus ^= 0x04 ;
1385 if (EmitterStatus == 0 || EmitterStatus == 1)
1399 void Emitter_control(uint8_t *EmitterStatus, uint8_t EmitterONTime, uint8_t EmitterOFFTime)
1402 if ( 0x80 == ( 0x80 & *EmitterStatus ) )
1410 *EmitterStatus &= 0x7F ;
1414 *EmitterStatus &= 0xFB ;
1430 NVIC_InitTypeDef NVIC_InitStructure ;
1432 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
1433 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
1434 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
1435 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
1436 NVIC_Init(&NVIC_InitStructure);
1438 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct ;
1441 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
1443 TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
1445 TIM_TimeBaseInitStruct.TIM_Prescaler = 1;
1446 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
1447 TIM_TimeBaseInitStruct.TIM_Period = 30000;
1448 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
1450 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
1452 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
1454 NVIC_EnableIRQ(TIM3_IRQn);
1456 TIM_Cmd(TIM3, ENABLE);
1508 TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
1524 (*TIM_Callback_Fn)();