STM32中IO口功能,GPIOB13是继电器吗?

不了解STM32中IO口的各功能,看不懂代码
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2个回答

各个IO口连接的元件都是可变的,看你的板子上的元件是怎么连接的了。你可以找到定义B13的管脚, 看看到底连接的什么。

看原理图接了什么

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
模拟IIC更改IO口以后,IIC设备读取数据失败
使用的是STM32F!03C8T6,然后用的是ADS1110芯片要读取AD值,IIC通信。之前调试的很稳定,但是因为需要更换IO口(由PB10,PB11换成了PA2,PA3)就没了反应。IIC底层代码使用的正点原子的代码。做了如下更改//IO方向设置//PA2,PA3 #define SDA_IN_2() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;} #define SDA_OUT_2() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;} //IO操作函数 #define IIC_SCL_2 PAout(2) //SCL #define IIC_SDA_2 PAout(3) //SDA #define READ_SDA_2 PAin(3) //输入SDA //PB10,PB11 #define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;} #define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;} //IO操作函数 #define IIC_SCL PBout(10) //SCL #define IIC_SDA PBout(11) //SDA #define READ_SDA PBin(11) //输入SDA 以下是ADS110代码 void ADS1110_config(void) //配置config寄存器 { IIC_Start(); //控制SCL和SDA线实现IIC通讯的开始; IIC_Send_Byte(0X90); while(IIC_Wait_Ack()) { printf("IICfailed\r\n"); break; } while(IIC_Wait_Ack()) { printf("IICfailed\r\n"); break; } IIC_Stop(); } void write_ads1110(u8 cmd)//写数据 { IIC_Start(); IIC_Send_Byte(0X90); //ADS1110地址 写 while(IIC_Wait_Ack()); IIC_Send_Byte(cmd); while(IIC_Wait_Ack()); IIC_Stop(); } u16 read_ads1110(void) { if((adc_sr&0x80)==0) { IIC_Start(); IIC_Send_Byte(0x91); //ADS1110地址 读 while(IIC_Wait_Ack()); adc_hi = IIC_Read_Byte(1); adc_lo = IIC_Read_Byte(1); IIC_Stop(); adc_lo1=(adc_hi<<8)+adc_lo; if(adc_lo1>65535)adc_lo1-=65535; } return adc_lo1; } u8 read_sr(void) { IIC_Start(); IIC_Send_Byte(0x91); //ADS1110地址 读 while(IIC_Wait_Ack()); adc_hi = IIC_Read_Byte(1); adc_lo = IIC_Read_Byte(1); adc_sr=IIC_Read_Byte(1); IIC_Stop(); return adc_sr; }
菜鸡求教,stm32f103的板子,做两路pwm输出,结果有一路没反应。
本菜鸡想用stm32103的板子控制两路舵机,就干脆直接在pwm程序上改了。我查了一下TIM3通道2的复用口的PB5,我就加一个通道1的复用口的PB4。 ![图片说明](https://img-ask.csdn.net/upload/201912/23/1577092428_313723.png) **但结果是原来的PB5口好用得很,但新加的PB4口毛用没有。求大神帮我解答,万分感谢!** ``` void TIM3_PWM_Init(u16 arr,u16 psc) { //定义变量 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //IO口配置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //使能PA4、PA5 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //定时器通用配置 TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //通道1配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道2配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); } int main(void) { u16 led0pwmval=0; u8 dir=1; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); TIM3_PWM_Init(20000-1,72-1); while(1) { TIM_SetCompare2(TIM3,20000-500); TIM_SetCompare1(TIM3,20000-500); delay_ms(1000); TIM_SetCompare2(TIM3,20000-550); TIM_SetCompare1(TIM3,20000-550); delay_ms(1000); } } ```
stm32f103引脚设置一样,但改变不了,咋回事
stm32f103GPIOB的引脚都一样设置,为什么pin3 和pin4一直都是高电平,设置低电平设置不了,奇怪!求解,各位!
为什么要配置STM32的外设时钟?
假如只是让LED灯点亮,为什么还要配置STM32的外设时钟?比如我配的50M的GPIOB的外设时钟,有什么作用? 灯亮灭的时间是另一个延时函数决定的,并不是IO自动的高低电平决定的啊。。。
STM32GPIO配置的问题??
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO宏操作结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB,ENABLE); //外设时钟配置, 开启GPIOB和GPIOD的时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置GPIOB口 请问STM32的GPIO端口配置,最后一条语句,如果我想同时配置GPIOA和GPIOB,能这么写吗?为什么?谢谢 GPIO_Init(GPIOA | GPIOB, &GPIO_InitStructure); //配置GPIOB口
有关使用stm32中spi3的问题
我在使用stm32中的spi3来驱动tlc2543的时候不成功,看了好久不知道是哪里出了问题,请大神们帮忙看看 void SPI3_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );//PORTBʱÖÓʹÄÜ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE );//SPI2ʱÖÓʹÄÜ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PB3ÊÇSCLK,PB4ÊÇOUT£¬PB5ÊÇÊäÈ룬PE2-6ÊÇCS1-5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15¸´ÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIOB GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIOB GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIOB // GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); //PB13/14/15ÉÏÀ­ SPI_Cmd(SPI3, DISABLE); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«ÏòÈ«Ë«¹¤ SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹ SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬ΪµÍµçƽ SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //´®ÐÐͬ²½Ê±Öӵĵڶþ¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑù£¬cpha=0£¬ SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼ SPI_InitStructure.SPI_CRCPolynomial = 7; //CRCÖµ¼ÆËãµÄ¶àÏîʽ SPI_Init(SPI3, &SPI_InitStructure); //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷ SPI_Cmd(SPI3, ENABLE); //ʹÄÜSPIÍâÉè // SPI3_ReadWriteByte(0xff);
STM32用MCP2515与另一块STM32通讯失败
大家,我最近在调试SPI转CAN模块MCP2515;我用jink查看配置寄存器,都没错,就是死活发不了数据,求助下大家; MCP2515和STM32zet6的SPI2连接: SPI程序设置为主机: //////////////////////////////////////////////////////////////////////////////////////////////////// GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB // GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设 SPI2_ReadWriteByte(0xff);//启动传输 spi发送代码: u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位 { retry++; if(retry>200)return 0; } SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位 { retry++; if(retry>200)return 0; } return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据 mcp2515初始化代码:--------------------------------------------------------------------------------- SPIByteWrite(CANCTRL,0x80); //MCP2515复位,进入配置模式 delay_ms(1); /*--------初始化接收过滤器,接收屏蔽器-----*/ SPIByteWrite(RXM0SIDH,0x00); SPIByteWrite(RXM0SIDL,0x00); //屏蔽器 SPIByteWrite(RXF0SIDH,0x00); //过滤器 SPIByteWrite(RXF0SIDL,0x00); /*-------------*/ //设置波特率为125Kbps ,共16个tq //set CNF1,SJW=00,长度为1TQ,BRP=1,TQ=[2*(BRP+1)]/Fsoc=2*2/8M=0.5us SPIByteWrite(CNF1,0x01); //set CNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(6+1)TQ=7TQ,PRSEG=(1+1)TQ=2TQ SPIByteWrite(CNF2,0xB1); //set CNF3,PHSEG2=(5+1)TQ=6TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位 SPIByteWrite(CNF3,0x05); //set TXB0,设置发送缓冲器0的标识符和发送的数据,以及发送的数据长度 SPIByteWrite(TXB0SIDH,0x00);//设置发送缓冲器0的标准标识符,待修改*** SPIByteWrite(TXB0SIDL,0x00);//用到标准标识符 /*set TXB1 SPIByteWrite(TXB1SIDH,0x50); //Set TXB0 SIDH SPIByteWrite(TXB1SIDL,0x00); //Set TXB0 SIDL SPIByteWrite(TXB1DLC,0x40 | DLC_8); //Set DLC = 3 bytes and RTR bit*/ //设置接收缓冲器0的标识符和初始化数据 SPIByteWrite(RXB0SIDH,0x00);//设置接收缓冲器0的标准标识符,待修改*** SPIByteWrite(RXB0SIDL,0x60);//用到标准标识符 SPIByteWrite(RXB0CTRL,0x60);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0 ,采用FILHIT0 SPIByteWrite(RXB0DLC,DLC_8);//设置接收数据的长度为8个字节 SPIByteWrite(RXF0SIDH,0x00);//初始化接收滤波器0,待修改*** SPIByteWrite(RXF0SIDL,0x00); SPIByteWrite(RXM0SIDH,0xFF);//初始化接收屏蔽器0,待修改*** SPIByteWrite(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//设置正常模式 dummy=SPIByteRead(CANSTAT); //如果还处于配置模式,就进入工作模式配置 if(OPMODE_NORMAL!=(dummy&&0xE0)) { SPIByteWrite(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//判断进入正常工作模式 } 这是MCP2515发送函数:----------------------------------------------------------------- unsigned char tempdata,j; tempdata=SPIByteRead(CAN_RD_STATUS); SPIByteWrite(TXB0DLC,length1); for(j=0;j<length1;j++) { SPIByteWrite(TXB0D0+j,CAN_TX_Buf[j]); } if(tempdata&0x04)//判断TXREQ标志位 { delay_ms(1); SPIByteWrite(TXB0CTRL,0);//清除TXREQ标志位 while(SPIByteRead(CAN_RD_STATUS)&0x04);//等待TXREQ清零 } CS=0; WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送 CS=1; 这是主函数:---我主要是通过mcp2515发送数据给另外一块stm32: int key=0; delay_init(); LED_Init(); SPI2_Init(); MCP_2515_init(); while(1) { CAN_Send_anylength(buf,0x08); delay_ms(1000); } 以上就是主要代码,完全是看手册的还有厂家给的代码,就是不通,求大神帮忙看看,谢谢,
STM32F407 SPI的SPI1->DR寄存器值不变
![图片说明](https://img-ask.csdn.net/upload/201504/18/1429340098_960264.jpg) 如图寄存器状态,不知道怎么回事,网上也搜不到类似的问题>.<;; 理论上,执行 SPIx->DR = Data;后SPI的SR寄存器应该变为SPIx->SR=0x0000(我的所有脚都悬空),但是结果却是SPIx->SR=0x0003,而且DR的值不变任然是SPIx->DR=0x0000。 不知道怎么回事啊,小弟接触arm没多久,谢谢啦! 下面是部分代码,SPI初始化和main函数。 ``` //main.c SPI2Init(); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); u32 temp=0; STM_EVAL_LEDToggle(LED4); while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)); SPI_I2S_SendData(SPI1,0x11); temp=0xfffff; while(temp) {temp--;} temp=0; //SPI1Init.c void SPI1Init(void){ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // Enable the SPI periph RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // Enable SCK, MOSI and MISO GPIO clocks RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); // Enable CS GPIO clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIOB,&GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); //Configure GPIO PIN for Lis Chip select GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_Init(GPIOA,&GPIO_InitStructure); //Deselect : Chip Select high GPIO_SetBits(GPIOA, GPIO_Pin_15); } ```
stm32串口发送可以进入中断但没有数据显示
程序功能是:若接收到数据0x55,则发送接收到的数据(0x55)。 但现在问题是:通过串口助手发送0x55,已经进入接收中断接受到数据,然后通过SendData函数发送数据,能进入发送中断,但是串口助手却没有显示0x55(好像是数据并没有发送出去) /*头文件*/ #ifndef __HEAD_H__ #define __HEAD_H__ #include <misc.h> #include <stm32f10x_usart.h> #include <stm32f10x_gpio.h> #include <STM32F10x_rcc.h> #include <stdint.h> #include "stm32f10x_flash.h" //#include <stm32100e_eval.h> //#include <stm32_eval.h> void NVIC_Configuration(void); void RCC_Configuration(void); void Usart_Initial(void); void gpio_Init(void); void Delayms(uint16_t ms); extern uint16_t rece; #endif /*函数*/ #include "head.h" void NVIC_Configuration(void){ //ÖжÏÓÅÏȼ¶ÉèÖà NVIC_InitTypeDef NVIC_InitStruc; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStruc.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruc.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruc.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruc.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruc); } void RCC_Configuration(void){ ErrorStatus HSEStartUpStatus; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(RCC_WaitForHSEStartUp() == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY==RESET)) {} RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource()!=0x08){} } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); } void Usart_Initial(void){ USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; // USART_ClockStructure.USART_Clock = USART_Clock_Disable; // USART_ClockStructure.USART_CPHA = USART_CPHA_2Edge; // USART_ClockStructure.USART_CPOL = USART_CPOL_Low; // USART_ClockStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockStructInit(&USART_ClockStructure); USART_Init(USART1,&USART_InitStructure); USART_ClockInit(USART1,&USART_ClockStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); // USART_ITConfig(USART1,USART_IT_TXE,ENABLE); // USART_ITConfig(USART1, USART_IT_RXNE,ENABLE); // USART_WakeUpConfig(USART1, USART_WakeUp_IdleLine); USART_Cmd(USART1,ENABLE); } void gpio_Init(void){ GPIO_InitTypeDef GPIO_InitSTA; GPIO_InitTypeDef GPIO_InitSTB; /* GPIO_PinLockConfig(GPIOB,GPIO_Pin_12);*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitSTA.GPIO_Mode = GPIO_Mode_Out_PP; //TxD1 GPIO_InitSTA.GPIO_Pin = GPIO_Pin_9; GPIO_InitSTA.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitSTA); GPIO_InitSTA.GPIO_Mode = GPIO_Mode_IN_FLOATING; //RxD1 GPIO_InitSTA.GPIO_Pin = GPIO_Pin_10; // GPIO_InitSTA.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitSTA); GPIO_InitSTB.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitSTB.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; GPIO_InitSTB.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitSTB); GPIO_SetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_10); GPIO_SetBits(GPIOB,GPIO_Pin_12 | GPIO_Pin_13); } void Delayms(uint16_t ms){ uint16_t i = 0; uint16_t j = 0; for(j = 0;j < ms;j ++){ for(i = 0;i < 12000;i ++){ } } } /*主程序,串口usart1中断函数*/ #include "head.h" #include "stdio.h" #include "stm32f10x_it.h" uint16_t rece = 0; int main(void){ NVIC_Configuration(); RCC_Configuration(); Usart_Initial(); gpio_Init(); USART_ITConfig(USART1,USART_IT_TXE,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_RESET); while(1){ // GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_SET); // Delayms(1000); GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_RESET); Delayms(1000); // USART_SendData(USART1,0x55); // Delayms(1000); // while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; } } void USART1_IRQHandler(void) { /* if(USART_GetITStatus(USART1, USART_IT_PE) != RESET) { USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); rece = USART_ReceiveData(USART1); } */ if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); //若发送0x55,引脚电平会变 // USART_SendData(USART1, 0xff); // while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; USART_ClearFlag(USART1,USART_FLAG_TC); USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { /* Disable USART1 RXNE Interrupt */ rece = USART_ReceiveData(USART1); USART_ClearFlag(USART1,USART_IT_RXNE); // USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); if(rece == 0x55){ // GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); USART_ITConfig(USART1,USART_IT_TXE,ENABLE); USART_SendData(USART1,rece); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; // printf("hello"); } } }
STM32 串口收发数据出错
#include "stm32f10x.h" #include <stdio.h> /************************************************* 函数: void RCC_Configuration(void) 功能: 复位和时钟控制 配置 参数: 无 返回: 无 **************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量 RCC_DeInit(); //复位RCC外部设备寄存器到默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好 if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好 { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后 FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时 RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟 while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟 { } } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures NVIC and Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //通道设置为串口3中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断 NVIC_Init(&NVIC_InitStructure); //初始化 } /******************************************************************************* 函数名:USART3_Configuration 输 入: 输 出: 功能说明: 初始化串口硬件设备,启用中断 配置步骤: (1)打开GPIO和USART3的时钟 (2)设置USART3两个管脚GPIO模式 (3)配置USART3数据格式、波特率等参数 (4)使能USART3接收中断功能 (5)最后使能USART3功能 */ void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第1步:打开GPIO和USART部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第3步:将USART Rx的GPIO配置为浮空输入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第4步:配置USART3参数*/ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); /* 若接收数据寄存器满,则产生中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 第5步:使能 USART3, 配置完毕 */ USART_Cmd(USART3, ENABLE); /* 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART3, USART_FLAG_TC); // 清标志 } /*******************************************************************/ /* */ /* STM32向串口3发送1字节 */ /* */ /* */ /*******************************************************************/ void Uart3_PutChar(u8 ch) { USART_SendData(USART3, (u8) ch); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } /*******************************************************************/ /* */ /* STM32在串口3接收1字节 */ /* 说明:串口3接收中断 */ /* */ /*******************************************************************/ void USART3_IRQHandler(void) { u8 dat; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收数据寄存器满 { dat = USART_ReceiveData(USART3); Uart3_PutChar(dat); } } /************************************************* 函数: int main(void) 功能: main主函数 参数: 无 返回: 无 **************************************************/ int main(void) { u8 abc[]={0x11,0x12,0x13,0x14}; u8 i; RCC_Configuration(); NVIC_Configuration(); USART3_Configuration(); for(i=0;i<4;i++) {Uart3_PutChar(abc[i]);} while(1); }
STM32F103C8T6芯片写的三路超声波读距离数据跳变问题
大家好,请大家帮我看看这个问题,我使用STM32F103C8T6这款芯片,参考网上的程序改写了一个使用定时器TIM4的三个通道分别读三个超声波距离的代码,但是三个超声波的数据均不准确,显示的数据完全超出正常范围(使用单个通道测试单个超声波的数据获取基本上正确可用)。相关程序如下: 一 定时器配置 void Ultrasonic_TIM4_Init(u16 arr, u16 psc) { TIM_ICInitTypeDef TIM_ICInitStruct; GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = arr; TIM_TimeBaseInitStruct.TIM_Prescaler = psc; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct); //TIM4 CH1 INIT TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; TIM_ICInitStruct.TIM_ICFilter = 0x00; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; //³õʌ׎̬ÉèÖÃΪÉÏÉýÑز¶»ñ TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM4, &TIM_ICInitStruct); //TIM4 CH2 INIT TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; TIM_ICInitStruct.TIM_ICFilter = 0x00; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM4, &TIM_ICInitStruct); //TIM4 CH3 INIT TIM_ICInitStruct.TIM_Channel = TIM_Channel_3; TIM_ICInitStruct.TIM_ICFilter = 0x00; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM4, &TIM_ICInitStruct); //CH1---PB6 CH2---PB7 CH3---PB8 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_ResetBits(GPIOB,GPIO_Pin_6); //TRIG PIN INIT PB0 PB1 PB2 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); // NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitStruct); // TIM_ITConfig(TIM4, TIM_IT_Update | TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM4, TIM_IT_Update | TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM4, TIM_IT_Update | TIM_IT_CC3, ENABLE); TIM_Cmd(TIM4, ENABLE); // Working_Light = 1; //code debug } 二 定时器中断函数 void TIM4_IRQHandler(void) { //CH1 if((TIM4CH1_CAPTURE_STA & 0x80) == 0) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1) { if(TIM4CH1_CAPTURE_STA & 0x40) { if((TIM4CH1_CAPTURE_STA & 0x3F) == 0x3F) { TIM4CH1_CAPTURE_STA |= 0x80; TIM4CH1_CAPTURE_VAL = 0xFFFF; // Working_Light = 0; //code debug } else { TIM4CH1_CAPTURE_STA++; // Indicator_Light_TIM2 = 0; //code debug } } } if(TIM_GetITStatus(TIM4, TIM_IT_CC1) == 1) { if(TIM4CH1_CAPTURE_STA & 0x40) { TIM4CH1_CAPTURE_STA |= 0x80; TIM4CH1_CAPTURE_VAL = TIM_GetCapture1(TIM4); TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Rising); // Indicator_Light_TIM2 = 1; //code debug } else { TIM4CH1_CAPTURE_STA = 0; TIM4CH1_CAPTURE_VAL = 0; TIM4CH1_CAPTURE_STA |= 0x40; TIM_SetCounter(TIM4, 0); TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Falling); // Working_Light = 1; //code debug } } } //CH2 if((TIM4CH2_CAPTURE_STA & 0x80) == 0)//»¹ÎŽ³É¹Š²¶»ñ { if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1) //žüÐÂÖжÏÔŽ ÖжϷ¢Éú£š¶šÊ±Æ÷ÖжϷ¢Éú£© { //CH2 if(TIM4CH2_CAPTURE_STA & 0x40) //ÒÑŸ­²¶»ñµœžßµçÆœÁË { if((TIM4CH2_CAPTURE_STA & 0x3F) == 0x3F) //žßµçƜ׎̬ { TIM4CH2_CAPTURE_STA |= 0x80; //±êŒÇ³É¹Š²¶»ñÁËÒ»ŽÎ TIM4CH2_CAPTURE_VAL = 0xFFFF; // Working_Light = 0; //code debug } else { TIM4CH2_CAPTURE_STA++; Indicator_Light_TIM2 = 0; //code debug } } } if(TIM_GetITStatus(TIM4, TIM_IT_CC2) == 1){ //ÍšµÀ2·¢Éú²¶»ñÊÂŒþ if(TIM4CH2_CAPTURE_STA & 0x40) // ²¶»ñµœÏÂœµÑØ { TIM4CH2_CAPTURE_STA |= 0x80; //±êŒÇ³É¹Š²¶»ñµœÒ»ŽÎÉÏÉýÑØ TIM4CH2_CAPTURE_VAL = TIM_GetCapture2(TIM4); TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Rising);//ÉèÖÃΪÉÏÉýÑز¶»ñ Indicator_Light_TIM2 = 1; //code debug } else { TIM4CH2_CAPTURE_STA = 0; //Çå¿Õ TIM4CH2_CAPTURE_VAL = 0; TIM4CH2_CAPTURE_STA |= 0x40; //±êŒÇ²¶»ñµœÁËÉÏÉýÑØ TIM_SetCounter(TIM4, 0); TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Falling); //ÉèÖÃΪÏÂœµÑز¶»ñ // Working_Light = 1; //code debug } } } //CH3 if((TIM4CH3_CAPTURE_STA & 0x80) == 0) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1) { if(TIM4CH3_CAPTURE_STA & 0x40) { if((TIM4CH3_CAPTURE_STA & 0x3F) == 0x3F) { TIM4CH3_CAPTURE_STA |= 0x80; TIM4CH3_CAPTURE_VAL = 0xFFFF; // Working_Light = 0; //code debug } else { TIM4CH3_CAPTURE_STA++; // Indicator_Light_TIM2 = 0; //code debug } } } if(TIM_GetITStatus(TIM4, TIM_IT_CC3) == 1) { if(TIM4CH3_CAPTURE_STA & 0x40) { TIM4CH3_CAPTURE_STA |= 0x80; TIM4CH3_CAPTURE_VAL = TIM_GetCapture3(TIM4); TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Rising); // Indicator_Light_TIM2 = 1; //code debug } else { TIM4CH3_CAPTURE_STA = 0; TIM4CH3_CAPTURE_VAL = 0; TIM4CH3_CAPTURE_STA |= 0x40; TIM_SetCounter(TIM4, 0); TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Falling); // Working_Light = 1; //code debug } } } // TIM_SetCounter(TIM4, 0); TIM_ClearITPendingBit(TIM4, TIM_IT_Update | TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3); //Çå³ýÖÐ¶Ï } 三 计算距离的函数 通道1 u16 Ultrasonic_Value() { u32 temp; GPIO_SetBits(GPIOB, GPIO_Pin_0); delay_us(20); GPIO_ResetBits(GPIOB, GPIO_Pin_0); // Ultrasonic_TIM4_Init(arr, psc); delay_ms(1); while(TIM4CH1_CAPTURE_STA&0x80) { temp=TIM4CH1_CAPTURE_STA&0X3F; temp*=65536;//Òç³öʱŒä×ÜºÍ temp+=TIM4CH1_CAPTURE_VAL;//µÃµœ×ܵĞߵçƜʱŒä //value = ~~ (cm) value = 340*temp/2/10000; TIM4CH1_CAPTURE_STA = 0; } return value; } 通道2 u16 Ultrasonic_Value2() { u32 temp; GPIO_SetBits(GPIOB, GPIO_Pin_1); delay_us(20); GPIO_ResetBits(GPIOB, GPIO_Pin_1); // delay_ms(1); while(TIM4CH2_CAPTURE_STA&0x80) { temp=TIM4CH2_CAPTURE_STA&0X3F; temp*=65536;//Òç³öʱŒä×ÜºÍ temp+=TIM4CH2_CAPTURE_VAL;//µÃµœ×ܵĞߵçƜʱŒä TIM4CH2_CAPTURE_STA &= 0x3f;//Çå3y±ê֟λ //value = ~~ (cm) value2 = 340*temp/2/10000; TIM4CH2_CAPTURE_STA = 0; } return value2; } 通道3 u16 Ultrasonic_Value3() { u32 temp; GPIO_SetBits(GPIOB, GPIO_Pin_2); delay_us(20); GPIO_ResetBits(GPIOB, GPIO_Pin_2); // delay_ms(1); while(TIM4CH3_CAPTURE_STA&0x80) { temp=TIM4CH3_CAPTURE_STA&0X3F; temp*=65536;//Òç³öʱŒä×ÜºÍ temp+=TIM4CH3_CAPTURE_VAL;//µÃµœ×ܵĞߵçƜʱŒä TIM4CH3_CAPTURE_STA &= 0x3f;//Çå3y±ê֟λ //value = ~~ (cm) value3 = 340*temp/2/10000; TIM4CH3_CAPTURE_STA = 0; } return value3; } 四 主函数 (主函数里我就把主要相关的代码贴出了) NVIC_Configuration(); Ultrasonic_TIM4_Init(0XFFFF,72-1); while(1){ switch (count){ case 0: Ultrasonic_Value(); count = 1; break; case 1: Ultrasonic_Value2(); count = 2; break; case 2: Ultrasonic_Value3(); count = 0; break; } 最后,我是通过Nokia5110来显示三个距离数据的,上面的代码已经确认定时器配置等没有问题(部分代码是在写帖子的时候改回来的,我现在将代码改为一个定时器负责一个超声波数据读取都不能达到要求,我想一个通道获取一路数据应该是正常的解决方式),因为已经能够通过各个通道读取到数据,但就是数据跳变的很厉害,完全不是正确数据。网络上面参考了很多方法,有的说是因为两个通道以上读取数据的时候,定时器就不能够清零,有的说定时器预装值不对等等。我能够使用stm32但是并不精通,所以这个问题困扰了我好久,本来要解决的demo也脱了很久了。在这里请各位帮我看看到底是什么原因导致了三个通道获取三个超声波数据会出现数据乱窜的问题。谢谢。
STM32F4超声波串口打印不出来,大神求救
STM32F4超声波模块测距,想串口助手显示距离打印不出来,新手求救,不仅感谢。程序如下: cs.c #include "cs.h" #include "stm32f4xx.h" #include "delay.h" #include "usart.h" /*¼Ç¼¶¨Ê±Æ÷Òç³ö´ÎÊý*/ uint overcount=0; /*ÉèÖÃÖжÏÓÅÏȼ¶*/ void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructer; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructer.NVIC_IRQChannelSubPriority=0; NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructer); } /*³õʼ»¯Ä£¿éµÄGPIOÒÔ¼°³õʼ»¯¶¨Ê±Æ÷TIM2*/ void CH_SR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructer; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer; RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /*TRIG´¥·¢ÐźÅ*/ GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructer); /*ECOH»ØÏìÐźÅ*/ GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9; GPIO_Init(GPIOB, & GPIO_InitStructer); /*¶¨Ê±Æ÷TIM2³õʼ»¯*/ TIM_DeInit(TIM2); TIM_TimeBaseInitStructer.TIM_Period=999;//¶¨Ê±ÖÜÆÚ1000 TIM_TimeBaseInitStructer.TIM_Prescaler=71; //·ÖƵϵÊý72 TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up; //TIM_TimeBaseInitStructer.TIM_RepetitionCounter TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//¿ªÆô¸üÐÂÖÐ¶Ï NVIC_Config(); TIM_Cmd(TIM2,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷ʹÄÜ } float Senor_Using(void) { float length=0,sum=0; u16 tim; uint i=0; /*²â5´ËÊý¾Ý¼ÆËãÒ»´Îƽ¾ùÖµ*/ while(i!=5) { PBout(8)=1; //À­¸ßÐźţ¬×÷Ϊ´¥·¢ÐźŠdelay_us(20); //¸ßµçƽÐźų¬¹ý10us PBout(8)=0; /*µÈ´ý»ØÏìÐźÅ*/ while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET); TIM_Cmd(TIM2,ENABLE);//»ØÏìÐźŵ½À´£¬¿ªÆô¶¨Ê±Æ÷¼ÆÊý i+=1; //ÿ´ÎÊÕµ½Ò»´Î»ØÏìÐźÅ+1,ÊÕµ½5´Î¾Í¼ÆËã¾ùÖµ while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//»ØÏìÐźÅÏûʧ TIM_Cmd(TIM2,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷ tim=TIM_GetCounter(TIM2);//»ñÈ¡¼ÆTIM2Êý¼Ä´æÆ÷ÖеļÆÊýÖµ£¬Ò»±ß¼ÆËã»ØÏìÐźŠlength=(tim+overcount*1000)/58.0;//ͨ¹ý»ØÏìÐźżÆËã¾àÀë sum=length+sum; TIM2->CNT=0; //½«TIM2¼ÆÊý¼Ä´æÆ÷µÄ¼ÆÊýÖµÇåÁã overcount=0; //ÖжÏÒç³ö´ÎÊýÇåÁã delay_ms(100); } length=sum/5; return length;//¾àÀë×÷Ϊº¯Êý·µ»ØÖµ } void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//Çå³ýÖжϱêÖ¾ overcount++; } } 主函数 #include "stm32f4xx.h" #include "usart.h" #include "delay.h" #include "cs.h" float ChangeDistance(int cout1) { float distance=0; printf("cou1=%d\n",cout1); distance=cout1/58.0; return distance; } int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2 delay_init(168); //ÑÓʱ³õʼ»¯ uart_init(115200); //´®¿Ú³õʼ»¯²¨ÌØÂÊΪ115200 // int count=0; // float distance=0; CH_SR04_Init(); printf("Senor_Using\n"); }
STM32767的FMC接口采集AD7606的4个通道数据出现了问题,麻烦各位帮忙纠正,没有C币,定有酬谢
问题:我用STM32CUBE配置的FMC接口,用的NE1,配置好后,但发现NE信号和NOE信号始终为高电平,convst信号接TIM3的PWM模式,频率先给2K,BUSY下降沿进入外部中断通过*(__IO uint16_t *)0x60000000地址读取AD采样值,用ST-LINK在线调试发现每次复位后运行程序四个通道只能读回一组数据,并且数据都相同,只有复位再运行才能再读出一组相同数据,求解。 代码如下: #include "stm32f7xx_hal.h" #define AD7606_RESULT() *(__IO uint16_t *)0x60000000 TIM_HandleTypeDef htim3; SRAM_HandleTypeDef hsram1; void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_FMC_Init(void); static void MX_TIM3_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); int16_t RawData[4]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_FMC_Init(); MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 432; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } if (HAL_PWREx_EnableOverDrive() != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK) { Error_Handler(); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* TIM3 init function */ static void MX_TIM3_Init(void) { __HAL_RCC_FMC_CLK_ENABLE(); TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 999; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 539; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 269; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim3); } /* FMC initialization function */ static void MX_FMC_Init(void) { FMC_NORSRAM_TimingTypeDef Timing; /** Perform the SRAM1 memory initialization sequence */ hsram1.Instance = FMC_NORSRAM_DEVICE; hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE; /* hsram1.Init */ hsram1.Init.NSBank = FMC_NORSRAM_BANK1; hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM; hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16; hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE; hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW; hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_DISABLE; hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE; hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE; hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE; hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY; hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE; hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE; /* Timing */ Timing.AddressSetupTime = 50; Timing.AddressHoldTime = 0; Timing.DataSetupTime = 60; Timing.BusTurnAroundDuration = 0; Timing.CLKDivision = 0; Timing.DataLatency = 0; Timing.AccessMode = FMC_ACCESS_MODE_A; /* ExtTiming */ if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) { Error_Handler(); } } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOK_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); /*Configure GPIO pin : PG12 */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /*Configure GPIO pin : PG9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, GPIO_PIN_SET); /*Configure GPIO pins : PK2 PK0 */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOK, &GPIO_InitStruct); /*Configure GPIO pins : PK2 PK0 */ /* GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);*/ //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOK, GPIO_PIN_2|GPIO_PIN_0, GPIO_PIN_RESET); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 2); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { RawData[0]=AD7606_RESULT(); RawData[1]=AD7606_RESULT(); RawData[2]=AD7606_RESULT(); RawData[3]=AD7606_RESULT(); void Error_Handler(void) { while(1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { } #endif
stm32adc配置问题应用到adc+dma+tim+usart
我将adc配置后读出的数一直为0,怀疑是否adc没有运作。下面是我写的程序,请大神们帮我指点一下,看看哪出了问题。 **********************************************************************************/ #include "adc.h" vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址 vu16 After_filter[M]; //用来存放求平均值之后的结果 u16 AD_Data_Ram[N]; u16 Get_RF_Data[N]; extern u16 RF_ADC1_Value_Count[ADRF_Arr_Count]; extern u16 V_ADC1_Value[ADRF_Arr_Count]; //存储采集电池电压缓存 /* * 函数名:ADC1_GPIO_Config * 描述 :使能ADC1和DMA1的时钟,初始化PC.01 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE); /*PB0-RF_AD输入 PB1-电压检测输入*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* 函数名:ADC1_Mode_Config * 描述 :配置ADC1的工作模式为DMA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; // ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* ADC1 configuration */ ADC_DeInit(ADC1); //复位ADC ADC_StructInit(&ADC_InitStructure); //初始化ADC结构体 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式用于多通道采集 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ENABLE 开启连续转换模式,即不停地进行ADC转换 ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None; //ADC_ExternalTrigConv_T2_CC2;//外部触发设置为TIM2 //(ADC_ExternalTrigConv_None; //不使用外部触发转换 (ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; )//使用外部中断线11作为转换外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = M; //要转换的通道数目2 ADC_Init(ADC1, &ADC_InitStructure); /*配置ADC时钟,为PCLK2的8分频,即9MHz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div8); /*配置ADC1的通道8为55.5个采样周期,序列为1 */ /*配置ADC1的通道9为55.5个采样周期,序列为2 */ // ADC_SampleTime_55Cycles5 ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_7Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_7Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5); /* Enable ADC1 external trigger */ // ADC_ExternalTrigConvCmd(ADC1, ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /*复位校准寄存器 */ ADC_ResetCalibration(ADC1); /*等待校准寄存器复位完成 */ while(ADC_GetResetCalibrationStatus(ADC1)); /* ADC校准 */ ADC_StartCalibration(ADC1); /* 等待校准完成*/ while(ADC_GetCalibrationStatus(ADC1)); /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); // DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA } void DMA_AD_Init(void) { DMA_InitTypeDef DMA_InitStructure; /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;//内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地 DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //开启DMA传输完成中断 // DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); // DMA_ClearITPendingBit(DMA_IT_TC); //清除一次DMA中断标志 DMA_Cmd(DMA1_Channel1, ENABLE); //Enable DMA channel1 } /* * 函数名:ADC1_Init * 描述 :无 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void ADC1_Init(void) { ADC1_GPIO_Config(); DMA_AD_Init(); ADC1_Mode_Config(); }
STM32F103和RC522模块通信,为什么M1卡无回应?
从网上下载的代码例程,可以正确运行,运行,硬件方面没问题,但我根据需要作出修改后,就无法读卡了。 源程序是如下连线 /******************************* *1--SS <----->PF0 //普通GPIO *2--SCK <----->PB13 *3--MOSI<----->PB15 *4--MISO<----->PB14 *5--IRQ 悬空 *6--GND <----->GND *7--RST <----->PF1 //普通GPIO *8--VCC <----->VCC ************************************/ 我修改成了 /******************************* *1--SS <----->PB12 //SPI的NSS口 *2--SCK <----->PB13 *3--MOSI<----->PB15 *4--MISO<----->PB14 *5--IRQ 悬空 *6--GND <----->GND *7--RST <----->PA8 //普通GPIO *8--VCC <----->VCC ************************************/ 初始化配置下 void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE ); RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8 -> RST GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_8); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12 -> SS GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_12); } 下面是我修改的位操作 #define SET_SPI_CS (GPIOB->BSRR = 0X1000) //PB12 -> 1 #define CLR_SPI_CS (GPIOB->BRR = 0X1000) //PB12 -> 0 #define SET_RC522RST GPIOA->BSRR = 0X0100 //PA8 -> 1 #define CLR_RC522RST GPIOA->BRR = 0X0100 //PA8 -> 0 不知道我这么修改可不可以,反正M1卡就是不理我
利用这个设计六路互补spwm波能否实现,今天去实验室仿真没波形,完全没学过stm32的小白制作课程设计
#include "timer.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// static void TIM_RCC_Config( void ); static void TIM_GPIO_Config( void ); static void TIM_NVIC_Config( void ); static void TIM_Config( void ); void TIM5_UPDATE(void); #define TIM5_IRQChannel ((u8)0x32) /* TIM5 global Interrupt */ extern u16 fqc; extern u16 fz; /* Private functions ---------------------------------------------------------*/ void TIM_APP_Config( void ) { TIM_RCC_Config(); TIM_GPIO_Config(); TIM_NVIC_Config(); TIM_Config(); } void TIM_RCC_Config(void) { RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM5 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM6, ENABLE ); } /******************************************************************************* * Function Name : GPIO_Configuration * Description : Configure the TIM1 Pins. * Input : None * Output : None * Return : None *******************************************************************************/ void TIM_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE); /* GPIOE Configuration: Channel 1, as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* GPIOE Configuration: BKIN pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /*GPIOB Configuration: as alternate function push-pull*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void TIM_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* 利用TIM5产生中断 更新SPWM占空比*/ NVIC_InitStructure.NVIC_IRQChannel= TIM5_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3; NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; NVIC_Init( &NVIC_InitStructure ); } void TIM_Config(void) { /* Time Base configuration */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1 ; TIM_TimeBaseStructure.TIM_Period = 36000/fz; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //TIM_ARRPreloadConfig(TIM1, ENABLE); /* Channel 1, Configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC1Init(TIM1, &TIM_OCInitStructure); //死区设置 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_DeadTime = 0; //这里调整死区大小0-0xff TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置) //TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //TIM1_OC2模块设置(设置2通道占空比) TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC2Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置) //TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM1_OC3模块设置(设置3通道占空比) TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC3Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置) //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM5_UPDATE(); TIM_TimeBaseStructure.TIM_Prescaler= 719; TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period= 20; TIM_TimeBaseStructure.TIM_ClockDivision= 0; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure ); TIM_SelectOutputTrigger( TIM3, TIM_TRGOSource_Update );// ADC Trigger 5KHz TIM_Cmd( TIM3, ENABLE ); /* TIM1 counter enable */ TIM_Cmd(TIM1, ENABLE); /* TIM1 Main Output Enable */ TIM_CtrlPWMOutputs(TIM1, ENABLE); } void TIM5_UPDATE(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler= 0; TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period= 20000/fqc; TIM_TimeBaseStructure.TIM_ClockDivision= 0; TIM_TimeBaseInit( TIM5, &TIM_TimeBaseStructure ); TIM_ITConfig( TIM5, TIM_IT_Update, ENABLE ); TIM_Cmd( TIM5, ENABLE ); }
Keil新手入门,刚开始看程序
#define E_H GPIO_SetBits(GPIOB, );这句话是什么意思呢?
我在程序里添加了四个中断函数,为什么火焰报警器和定时器的中断就能触发,按键的中断就触发不了
#include "Exti.h" #include "./led/bsp_led.h" static void NVIC_Configuaration2(void) { NVIC_InitTypeDef NVIC_InitStructure; //中断分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //主优先级 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //子优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //使能中断 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //中断源火焰传感器 NVIC_InitStructure.NVIC_IRQChannel=FIRE_INT_EXTI_IRQ ; NVIC_Init(&NVIC_InitStructure); } void EXTI_Fire_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; Fire_GPIO_Config(); NVIC_Configuaration2(); //火焰传感器的EXTI配置 //选择EXTI的信号源为火焰传感器 GPIO_EXTILineConfig(FIRE_INT_EXTI_PORTSOURCE,FIRE_INT_EXTI_PINSOURCE); EXTI_InitStructure.EXTI_Line=FIRE_INT_EXTI_LINE ; //EXTI模式为中断 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //上升沿触发 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //使能EXTI EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void Fire_GPIO_Config() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStructure); } 这是火焰传感器的中断配置 void FIRE_IRQHandler (void) { if(EXTI_GetITStatus(FIRE_INT_EXTI_LINE)!=RESET) { Fire_Flag=1; EXTI_ClearITPendingBit(FIRE_INT_EXTI_LINE); } 这是火焰传感器的中断函数 void FireAlarm(void) { if(Fire_Flag==1) { Fire_Flag=0; OLED_Init(); OLED_ShowStr(0,10,(unsigned char*)"Fire Warning",2); while(1) { GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); Delay_ms(200); GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); Delay_ms(200); GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN); Delay_ms(200); GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN); } } } 这是触发火焰传感器中断后要执行的函数 static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 配置NVIC为优先级组1 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源:按键1 */ NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ; /* 配置抢占优先级 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 配置子优先级 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断通道 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 配置中断源:按键2,其他使用上面相关配置 */ NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); } 这是按键的NVIC配置 void EXTI_Key_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /*开启按键GPIO口的时钟*/ RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK,ENABLE); /* 配置 NVIC 中断*/ NVIC_Configuration(); /*--------------------------KEY1配置-----------------------------*/ /* 选择按键用到的GPIO */ GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN; /* 配置为浮空输入 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); /* 选择EXTI的信号源 */ GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE; /* EXTI为中断模式 */ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /* 上升沿中断 */ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; /* 使能中断 */ EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } 按键1的EXTI配置 void KEY1_IRQHandler(void) { if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)!=RESET) { RESET_Flag=1; EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } } 按键1的中断配置 void RESETs(void) { if(RESET_Flag==1) { RESET_Flag=0; /* 关闭所有led灯 */ GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); /* 关闭所有led灯 */ GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); /* 关闭所有led灯 */ GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN); } } 这是进入按键1中断之后再应该执行的函数
树莓派大神求救,源码看不懂 啊
import com.pi4j.wiringpi.Spi; public class WiringPiSPIExample { // SPI operations public static byte WRITE_CMD = 0x40; public static byte READ_CMD = 0x41; @SuppressWarnings("unused") public static void main(String args[]) throws InterruptedException { // // This SPI example is using the WiringPi native library to communicate with // the SPI hardware interface connected to a MCP23S17 I/O Expander. // // Please note the following command are required to enable the SPI driver on // your Raspberry Pi: // > sudo modprobe spi_bcm2708 // > sudo chown `id -u`.`id -g` /dev/spidev0.* // // this source code was adapted from: // https://github.com/thomasmacpherson/piface/blob/master/python/piface/pfio.py // // see this blog post for additional details on SPI and WiringPi // http://wiringpi.com/reference/spi-library/ // // see the link below for the data sheet on the MCP23S17 chip: // http://ww1.microchip.com/downloads/en/devicedoc/21952b.pdf System.out.println("<--Pi4J--> SPI test program using MCP23S17 I/O Expander Chip"); // configuration byte IODIRA = 0x00; // I/O direction A byte IODIRB = 0x01; // I/O direction B byte IOCON = 0x0A; // I/O config byte GPIOA = 0x12; // port A byte GPIOB = 0x13; // port B byte GPPUA = 0x0C; // port A pullups byte GPPUB = 0x0D; // port B pullups byte OUTPUT_PORT = GPIOA; byte INPUT_PORT = GPIOB; byte INPUT_PULLUPS = GPPUB; // setup SPI for communication int fd = Spi.wiringPiSPISetup(0, 10000000); if (fd <= -1) { System.out.println(" ==>> SPI SETUP FAILED"); return; } // initialize write(IOCON, 0x08); // enable hardware addressing write(GPIOA, 0x00); // set port A off write(IODIRA, 0); // set port A as outputs write(IODIRB, 0xFF); // set port B as inputs write(GPPUB, 0xFF); // set port B pullups on int pins = 1; // infinite loop while(true) { // shift the bit to the left in the A register // this will cause the next LED to light up and // the current LED to turn off. if(pins >= 255) pins=1; write(GPIOA, (byte)pins); pins = pins << 1; Thread.sleep(1000); // read for input changes //read(INPUT_PORT); } } public static void write(byte register, int data){ // send test ASCII message byte packet[] = new byte[3]; packet[0] = WRITE_CMD; // address byte packet[1] = register; // register byte packet[2] = (byte)data; // data byte System.out.println("-----------------------------------------------"); System.out.println("[TX] " + bytesToHex(packet)); Spi.wiringPiSPIDataRW(0, packet, 3); System.out.println("[RX] " + bytesToHex(packet)); System.out.println("-----------------------------------------------"); } public static void read(byte register){ // send test ASCII message byte packet[] = new byte[3]; packet[0] = READ_CMD; // address byte packet[1] = register; // register byte packet[2] = 0b00000000; // data byte System.out.println("-----------------------------------------------"); System.out.println("[TX] " + bytesToHex(packet)); Spi.wiringPiSPIDataRW(0, packet, 3); System.out.println("[RX] " + bytesToHex(packet)); System.out.println("-----------------------------------------------"); } public static String bytesToHex(byte[] bytes) { final char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] hexChars = new char[bytes.length * 2]; int v; for ( int j = 0; j < bytes.length; j++ ) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } } ``` 代码神码意思 ```
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问