/*============================================================================== * DESCRIPTION: * @param * @return * @precondition * @postcondition * @caution * @notes *============================================================================*/ uint8_t OT_GPIO_bursts_to_ignore(void) { // Interpret DIP2, DIP1, DIP0 as a binary value uint8_t retval = 0; if (RESET != GPIO_ReadInputPin(DIP0_PORT, DIP0_PIN)) { retval |= 0x01; } if (RESET != GPIO_ReadInputPin(DIP1_PORT, DIP1_PIN)) { retval |= 0x02; } if (RESET != GPIO_ReadInputPin(DIP2_PORT, DIP2_PIN)) { retval |= 0x04; } return retval; }
/* 名称: void Read_Data(void) 功能: 发送数据 形参: 无 返回: 读取到的数据 说明:D0~D3 = COM1~COM4 = 0b0000 D0 D1 D2 D3 */ uint8_t Read_Data(void) { uint8_t i, data = 0; DATA_IN; WR_1; for(i = 0; i < 4; i++) { RD_0; data <<= 1; if(GPIO_ReadInputPin(GPIOB, GPIO_PIN_5)) data++; RD_1; } return data; }
//****************读取HC165数据 void Read165(u8 *rdata) { u8 num=0; GPIO_WriteLow(GPIOD,H165_SH); asm("nop"); asm("nop"); GPIO_WriteHigh(GPIOD,H165_SH); asm("nop"); for(num=0; num<4; num++) { for(u8 i=0; i<8; i++) { *(rdata+num)<<=1; if(GPIO_ReadInputPin(GPIOD,H165_DATA)) { *(rdata+num) += 1; } GPIO_WriteLow(GPIOD,H165_CLK); asm("nop"); GPIO_WriteHigh(GPIOD,H165_CLK); //上升沿 asm("nop"); } } }
uint8_t SPIReadByte(void) { uint8_t Data = 0; #ifdef USE_SPI_MODULE /*!< Wait until the transmit buffer is empty */ while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET) {} /*!< Send the byte */ SPI_SendData(SD_DUMMY_BYTE); /*!< Wait until a data is received */ while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET) {} /*!< Get the received data */ Data = SPI_ReceiveData(); #else uint8_t i; GPIO_WriteLow(ENC_SCK_PORT,ENC_SCK_PIN); for(i=0;i<8;i++) { GPIO_WriteHigh(ENC_SCK_PORT,ENC_SCK_PIN); Data <<=1; if(0 != GPIO_ReadInputPin(ENC_MISO_PORT,ENC_MISO_PIN)) Data |= 0x01; GPIO_WriteLow(ENC_SCK_PORT,ENC_SCK_PIN); } #endif /*!< Return the shifted data */ return Data; }
int main( void ) { uint32_t Address_EEPROM=EEPROM_START+4; uint32_t n0=0; uint32_t n1=0; uint32_t k0=0; uint32_t k1=0; uint8_t ERR=2; uint8_t rr=0; CLK_Init(); UART_Init(); GP_IO_Init(); TIMR2_Init(); FLASH_EEPROM_Unlock(); A_D_C_Init(); //enableInterrupts(); //Разрешаем прерывания. while(1) { /* if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_2)==0) { GPIO_WriteLow(GPIOB, GPIO_PIN_6); delay_ms(50); GPIO_WriteHigh(GPIOB, GPIO_PIN_6); while(GPIO_ReadInputPin(GPIOC, GPIO_PIN_2)==0){delay_ms(10);}; }; if(GPIO_ReadInputPin(GPIOE, GPIO_PIN_5)==0) { GPIO_WriteLow(GPIOB, GPIO_PIN_7); delay_ms(50); GPIO_WriteHigh(GPIOB, GPIO_PIN_7); while(GPIO_ReadInputPin(GPIOE, GPIO_PIN_5)==0){delay_ms(10);}; }; */ if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_1)==0) { ERR=0; GPIO_WriteHigh(GPIOB, GPIO_PIN_5); GPIO_WriteHigh(GPIOB, GPIO_PIN_6); while(GPIO_ReadInputPin(GPIOC, GPIO_PIN_1)==0){delay_ms(10);}; }; if(ERR==0) { GPIO_WriteLow(GPIOB, GPIO_PIN_7); //delay_ms(6); FLASH_ProgramWord(Address_EEPROM, n0); //FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA); GPIO_WriteHigh(GPIOB, GPIO_PIN_7); delay_ms(4); n1 = FLASH_ReadWord(Address_EEPROM); if(n1!=n0) { ERR=1; }else { n0++; GPIO_WriteReverse(GPIOF, GPIO_PIN_4); }; }else if(ERR==1) { GPIO_WriteReverse(GPIOB, GPIO_PIN_5); delay_ms(100); }else if(ERR==2) { GPIO_WriteReverse(GPIOB, GPIO_PIN_6); delay_ms(100); }; /* GPIO_WriteLow(GPIOB, GPIO_PIN_6); delay_ms(50); GPIO_WriteHigh(GPIOB, GPIO_PIN_6); GPIO_WriteLow(GPIOB, GPIO_PIN_7); delay_ms(50); GPIO_WriteHigh(GPIOB, GPIO_PIN_7); GPIO_WriteLow(GPIOB, GPIO_PIN_5); delay_ms(50); GPIO_WriteHigh(GPIOB, GPIO_PIN_5); delay_ms(1000); */ } //return 0; }
// 初始化GPIO void system_config_gpio_config(void) { // STM8S105K6 没有PB6 PB7 所以使用 PB2 PB3代替 GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOD); // GPIO_DeInit(GPIOE); // 中断引脚 没用到中断 只用到了电平判断 // GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT); GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_IN_PU_IT); // GIO0 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_ONLY); // EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY); GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); // CE SX1278 - RST GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); // CS GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); // SCK GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); // SDI GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); // SDO // 插座状态 和 插座继电器控制 GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST); // 是否收到信号 状态 GPIO_Init(GPIOB, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); // 继电器 必须设置为低电平 否则会一上电 继电器就是开的状态 GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_RISE_FALL); // EXTI_SENSITIVITY_RISE_ONLY); // EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_RISE_ONLY); #if 0 GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOD); // GPIO_DeInit(GPIOE); // 中断引脚 没用到中断 只用到了电平判断 // GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT); GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_IN_PU_IT); // GIO0 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_ONLY); // EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY); GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); // CE SX1278 - RST GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); // CS GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); // SCK GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); // SDI GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); // SDO // 插座状态 和 插座继电器控制 GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST); // 是否收到信号 状态 GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST); // 继电器 必须设置为低电平 否则会一上电 继电器就是开的状态 // GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); // 按键 每按一次 翻转一次 GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_RISE_FALL); // EXTI_SENSITIVITY_RISE_ONLY); // EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_RISE_ONLY); //GPIO_WriteHigh(GPIOB, GPIO_PIN_6); //GPIO_WriteLow(GPIOB, GPIO_PIN_6); GPIO_WriteHigh(GPIOD, GPIO_PIN_0); GPIO_WriteLow(GPIOD, GPIO_PIN_0); GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); // SDO while(1) { if (GPIO_ReadInputPin( GPIOB, GPIO_PIN_7 )) { printf("a"); } else { printf("b"); } } #endif #if 0 GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOE); GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); //RESET GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); //SCK GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); //SDO GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); //SDI GPIO_Init(GPIOF, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); //CS GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //GIO0 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC,EXTI_SENSITIVITY_RISE_ONLY); // Interrupt on Rising edge only EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY); GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); // 继电器 GPIO_Init(GPIOD, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST); // 是否收到信号 GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT); // 按键 每按一次 翻转一次 #endif }
void main(void) { uint8_t i; BitStatus bytes; CLK_HSICmd(ENABLE);//开始内部高频RC CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//不分频 16MHz /* Initialize I/Os in Output Mode */ init_usart1(); // 输入判断 GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);// 输出 模式 用于Trag GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);// 输出 模式 用于Trag GPIO_WriteHigh(GPIOA, GPIO_PIN_2); GPIO_Init(GPIOA,GPIO_PIN_1,GPIO_MODE_IN_PU_NO_IT); // 输入包含 上拉 中断 // GPIO_Init(GPIOA,GPIO_PIN_1,GPIO_MODE_IN_PU_IT); // EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_ONLY); InitADC(); enableInterrupts(); flageExtiA=0; sendBuff[0]=DEVICE_ID; sendBuff[3]=0xff; sendBuff[4]=0xff; sendBuff[5]=0xFF; sendBuff[6]=0xA0; sendBuff[7]=0xFA; while (1) { bytes=GPIO_ReadInputPin(GPIOA,GPIO_PIN_1); if(bytes==RESET && flageExtiA==0) { flageExtiA=1; GPIO_WriteReverse(GPIOA,GPIO_PIN_3); for(i=0;i<8;i++) { Send(sendBuff[i]); } }else if(bytes!=RESET) { flageExtiA=0; } datas=readADCs(); sendBuff[5]=0; sendBuff[1]=(uint8_t)(datas&0xff); sendBuff[2]=(uint8_t)((datas>>8)&0xff); for(i=0;i<5;i++) { sendBuff[5]+=sendBuff[i]; } // datas=datas; // bytes=GPIO_ReadInputPin(GPIOA,GPIO_PIN_1); // if(flageExtiA!=1) // { // sendBuff[1]=(uint8_t)(datas&0xff); // sendBuff[2]=(uint8_t)((datas>>8)&0xff); // sendBuff[5]=0; // for(i=0;i<5;i++) // { // sendBuff[5]+=sendBuff[i]; // } // } } }
static BitStatus data_in() { GPIO_Init(LCDDIG_PORT, (GPIO_Pin_TypeDef)(LCDDIG_DATA_PIN ), GPIO_MODE_IN_FL_NO_IT); return GPIO_ReadInputPin(LCDDIG_PORT,(GPIO_Pin_TypeDef)(LCDDIG_DATA_PIN )); }
void main(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); Delay_Init(); RS485_Init(115200); #if DEBUG // UART_Init(115200); #endif SRF05_Init(); SRF05_AutoPoolEnable(); //flash_read_buffer((char *)&my_data, sizeof (struct flash_data)); my_data.id = 0x21; // UART_SendByte(0x21, HEX); // RS485_SendStr("Hello world.\n"); // LED run GPIO_Init(LED_RUN_PORT, LED_RUN_PIN, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_WriteHigh(LED_RUN_PORT, LED_RUN_PIN); while (1) { if (Millis() - tmp_time > 500) { LED_RUN_TOGGLE; tmp_time = Millis(); #if DEBUG RS485_DIR_OUTPUT; RS485_SendStr("\n"); RS485_SendFloat(SRF05_GetDistance()); RS485_DIR_INPUT; #endif } if (GPIO_ReadInputPin(RS485_SEL_PORT, RS485_SEL_PIN) == RESET) { if (RS485_Available() >= 8) { // memset(packet_buff, 0, PACKET_BUFFER_SIZE); packet_len = RS485_GetData(packet_buff); packet = (struct Packet *)packet_buff; if (packet_len < 4 + getTypeLength(packet->data_type)) { // not enough length } else { switch (packet->cmd) { case CMD_QUERY: if (packet->id == my_data.id) { LED_RUN_TOGGLE; tmp_distance = SRF05_GetDistance(); packet->data_type = TYPE_FLOAT | BIG_ENDIAN_BYTE_ORDER; memcpy(packet->data, &tmp_distance, getTypeLength(packet->data_type)); packet->data[getTypeLength(packet->data_type)] = checksum((char *)packet); RS485_DIR_OUTPUT; RS485_SendData(packet_buff, 4 + getTypeLength(packet->data_type)); RS485_DIR_INPUT; } else if (IS_BROADCAST_ID(packet->id)) { // if (GPIO_ReadInputPin(RS485_SEL_PORT, RS485_SEL_PIN) == RESET) // { LED_RUN_TOGGLE; packet->id = my_data.id; tmp_distance = SRF05_GetDistance(); packet->data_type = TYPE_FLOAT | BIG_ENDIAN_BYTE_ORDER; memcpy(packet->data, &tmp_distance, getTypeLength(packet->data_type)); packet->data[getTypeLength(packet->data_type)] = checksum((char *)packet); RS485_DIR_OUTPUT; RS485_SendData(packet_buff, 4 + getTypeLength(packet->data_type)); RS485_DIR_INPUT; // } } else { // not own id } break; case CMD_CONTROL: // by default, this mode used only for setting id // the id stored on the first bytes of data bytes if (IS_BROADCAST_ID(packet->id)) { LED_RUN_TOGGLE; if (IS_SENSOR_ULTRA_SONIC(packet->data[0])) { my_data.id = packet->data[0]; } } break; default: break; } RS485_Flush(); } } } else { RS485_Flush(); } SRF05_ProcessTrigger(); } }