请问stm32直接操作寄存器怎么建工程啊,和库函数版本一样吗? 20C

请问stm32直接操作寄存器怎么建工程啊,和库函数版本一样吗?求大神指教,本人菜鸟一只

1个回答

库函数版本也是支持直接操作寄存器的。但也可以不用,工程会简单很多,只包含STM32F103X.h这样的头文件就OK了。初学者建议用库函数版本,简单容易上手

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
STM32多机通讯,安卓板为上位机,下位机为几个STM32串口接收数据(应该是2~10个)
1:STM32多机通讯,安卓板为上位机,下位机为几个STM32串口接收数据(应该是2~10个),请大神指教, 2:要有程序代码提供(最好是有寄存器配置版本的。如是库函数版的请说清楚)
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); } ```
STM32C语言位操作符的知识
这些与或非,取反,异或,右移,左移这些到底怎么回事,这里我们就不多做详细,相信 大家学 C 语言的时候都学习过了。如果不懂的话,可以百度一下,非常多的知识讲解这些操作 符。下面我们想着重讲解位操作在单片机开发中的一些实用技巧。 1) 不改变其他位的值的状况下,对某几个位进行设值。 这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作 GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0 然后再与需要设置的值进行|或运算 GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值 2) 移位操作提高代码的可读性。 移位操作在单片机开发中也非常重要,下面让我们看看固件库的 GPIO 初始化的函数里 面的一行代码 GPIOx->BSRR = (((uint32_t)0x01) << pinpos); 这个操作就是将 BSRR 寄存器的第 pinpos 位设置为 1,为什么要通过左移而不是直接设 置一个固定的值呢?其实,这是为了提高代码的可读性以及可重用性。这行代码可以 很直观明了的知道,是将第 pinpos 位设置为 1。如果你写成 GPIOx->BSRR =0x0030; 这样的代码就不好看也不好重用了。 类似这样的代码很多: GPIOA->ODR|=1<<5; //PA.5 输出高,不改变其他位 这样我们一目了然,5 告诉我们是第 5 位也就是第 6 个端口,1 告诉我们是设置为 1 了。 求教,此处对于十六进制的位操作运算是如何清零置数过程的,STM32小白求助
stm32f303 ADC 模拟看门狗不能中断
芯片:stm32f303CBT6 IDE:keil 我配置好后ADC后,当从ADC通道引脚输入的电压超过设置范围后, 不能进入ADC模拟看门狗中断。 但在main函数while循环里调用ADC_GetConversionValue(ADC1)时,才会进入 ADC模拟看门狗中断,请问有人用过stm32f303的看门狗吗? 如果只有在while循环体中不断调用ADC_GetConversionValue(ADC1)才能进入ADC 模拟中断的话,那这个中断失去意义了,那程序每次读取后也可判断范围。我想应该 是不用调用ADC_GetConversionValue(ADC1)也可以进入中断的,只不过我代码用得 不对,以下是代码,请用过stm32f303看门狗的帮忙指正,在这里谢谢了。 **注:不用DMA功能,用DMA功能当然可以产生中断,因为DMA会在后台会读取ADC数据寄存器。** u32 calibration_value1 = 0; void ADC1_2_IRQHandler(void) { if(SET == ADC_GetFlagStatus(ADC1,ADC_FLAG_AWD1)) { ADC_ITConfig(ADC1,ADC_IT_AWD1,DISABLE); ADC_ClearFlag(ADC1,ADC_FLAG_AWD1); ADC_ClearITPendingBit(ADC1,ADC_IT_AWD1); } if(SET == ADC_GetFlagStatus(ADC2,ADC_FLAG_AWD2)) { ADC_ITConfig(ADC2,ADC_IT_AWD2,DISABLE); ADC_ClearITPendingBit(ADC2,ADC_IT_AWD2); } } void adc1_init(void) { ADC_CommonInitTypeDef cs; ADC_InitTypeDef adcs; ADC_VoltageRegulatorCmd(ADC1, ENABLE); delay_ms(1); ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1) != RESET ); calibration_value1 = ADC_GetCalibrationValue(ADC1); adcs.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable; adcs.ADC_Resolution = ADC_Resolution_12b; adcs.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;//ADC_ExternalTrigConvEvent_7 adcs.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; adcs.ADC_DataAlign = ADC_DataAlign_Right; adcs.ADC_OverrunMode = ADC_OverrunMode_Disable; adcs.ADC_AutoInjMode = ADC_AutoInjec_Disable; adcs.ADC_NbrOfRegChannel = 1; ADC_Init(ADC1, &adcs); cs.ADC_Clock = ADC_Clock_AsynClkMode; cs.ADC_Mode = ADC_Mode_Independent;//ADC_Mode_Interleave; cs.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;; cs.ADC_DMAMode = ADC_DMAMode_Circular; cs.ADC_TwoSamplingDelay = 0; ADC_CommonInit(ADC1, &cs); //Tconv = Sampling time + 12.5 ADC clock cycles (12.5+Sampling)/64M ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_61Cycles5);//ADC_SampleTime_1Cycles5 ADC_Cmd(ADC1, ENABLE); } void adc1_watchDog_cfg(void) { ADC_AnalogWatchdog1SingleChannelConfig(ADC1,ADC_Channel_3); ADC_AnalogWatchdog1ThresholdsConfig(ADC1,400,0); ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable); ADC_ITConfig(ADC1,ADC_IT_AWD1,ENABLE); } void ad_gpio_cfg(void) { GPIO_InitTypeDef gs; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // RCC_AHB1PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); gs.GPIO_Mode = GPIO_Mode_AN; gs.GPIO_OType = GPIO_OType_PP; gs.GPIO_PuPd = GPIO_PuPd_NOPULL; gs.GPIO_Speed = GPIO_Speed_50MHz; //PA1--->ADC1_IN2 PA2--->ADC1_IN3 PA4--->ADC2_IN1 gs.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4; GPIO_Init(GPIOA, &gs); } void adc_init(void) { //VrefintCal = *((u16 *)(VREFINT_CAL_ADDR)); ad_gpio_cfg(); RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);//RCC_ADC12PLLCLK_Div1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); ADC_DeInit(ADC1); adc1_init(); adc1_watchDog_cfg(); ADC_StartConversion(ADC1); } mai函数 int main(void) { ... while(1) { ADC_GetConversionValue(ADC1); } ... } ``` ```
STM32F407中定时器1和定时器5的触发关系
我利用STM32F407控制电机,用TIM1输出互补对称的PWM波,利用TIM3读取 磁编码器的相对式位置,并用TIM3触发TIM5来进行数据记录。 现在遇到的情况是: 1、我用延时函数使得电机在不使用磁编码器的情况下缓慢旋转,然而当我的磁编码器远离电机时,电机发出了啸叫声(比较大的电流声),而磁编码器靠近电机磁铁的时候,啸叫声消失。 2、TIM1配置为SMCR = 0x00,也就是从模式被禁止; TIM5配置为从模式,TIM3配置为主模式; 3、当屏蔽掉TIM5的初始化或者TIM3的初始化,或者屏蔽掉两者的主从模式初始化,均能使啸叫声消失 查阅参考手册,发现TIM1的SMCR寄存器的TS位为0时,接受来自定时器5的触发。但是SMS位既然已经是0,说明从模式应该已经被禁止了;但实际上定时器又确实被定时器3或者5给影响了。请问这是怎么回事呢?
STM8S208mb 串口寄存器配置问题
各位,请教一下,我直接配置寄存器,写的发送串口数据的函数,能运行,调试时也能跑到这个函数里,但是却发布出来数据。 请帮忙看一下,是不是哪里配置错了,感谢。 ![图片说明](https://img-ask.csdn.net/upload/201804/25/1524650985_167279.png) ![图片说明](https://img-ask.csdn.net/upload/201804/25/1524651028_115093.png)![图片说明](https://img-ask.csdn.net/upload/201804/25/1524651042_332126.png)
新手想问一个stm32开发的相关问题
cortex m3的库函数中gpio输入输出方式相应的值是如何按照寄存器的各位的设置确定的??图片为库函数中相应输入输出方式的值以及寄存器的配置方式![![图片说明](https://img-ask.csdn.net/upload/201705/01/1493626003_526273.png)图片说明](https://img-ask.csdn.net/upload/201705/01/1493625990_702281.png)
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); } 以上就是主要代码,完全是看手册的还有厂家给的代码,就是不通,求大神帮忙看看,谢谢,
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); }
STM32F013用FSMC驱动SSD1289控制气的问题
尊敬的大侠们,菜鸟我刚买了个stm32f103的板子,用fsmc驱动时发现当你使用变化的数据流往寄存器写数据时(即显示图片时),他无法刷屏,直接是当前的刷屏背景,复位都没有用,但是你写入一种颜色数据确实正常的....代码附上,求大神帮忙 、、、、、、、、、、、、这是LCD.C中的、、、、、、、、、、、、、、、、、、、 #include "include.h" /* *函数名: void LCD_FSMCConfig(void) *描述: 初始化FSMC *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p; //设置地址建立时间 p.FSMC_AddressSetupTime = 5; //设置地址保持时间 p.FSMC_AddressHoldTime = 0; //设置数据建立时间 p.FSMC_DataSetupTime = 10; //总线返转时间 p.FSMC_BusTurnAroundDuration = 0; //时钟分频 p.FSMC_CLKDivision = 0; //数据保持时间 p.FSMC_DataLatency = 0; //FSMC选用模式 p.FSMC_AccessMode = FSMC_AccessMode_A; //选择设置的BANK以及片选信号(BANK1中的第一个block) FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //设置是否数据地址总线时分复用(No) FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //设置存储器类型(NOR) FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; //设置数据宽度(16bit) FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //设置是否使用迸发访问模式(连续读写模式)(No) FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; //设置WAIT信号的有效电平(低电平有效) FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; //设置是否使用还回模式(No) FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //设置WAIT信号有效时机(在wait状态之前) FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; //设置是否使能写操作(Yes) FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //设置是否使用WAIT信号(No) FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //设置是否使用扩展模式(读写时序相互独立)(No) FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //设置是否使用迸发写模式(No) FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //设定读写时序 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC Bank1_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); } /* *函数名: void LCD_IOConfig(void) *描述: 初始化LCD的IO口 *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_IOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; //打开FSMC时钟和GPIO口时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); /********************打开FSMC的数据端口D[15:0]****************************/ /*初始化GPIOD口,电路图从左至右*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_0|GPIO_Pin_9| GPIO_Pin_5|GPIO_Pin_15|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_10 |GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOD , &GPIO_InitStructure); /*初始化GPIOE口,电路图从左至右*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11| GPIO_Pin_13|GPIO_Pin_15|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_14; GPIO_Init(GPIOE , &GPIO_InitStructure); /* RS接PD11---A16*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; GPIO_Init(GPIOD , &GPIO_InitStructure); /*NE1------LCD_CS--->GPIOD-7*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_Init(GPIOD , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD, GPIO_Pin_12);//取消LCD 的复位 } /* *函数名: void delay_ms(uint16_t ms) *描述: *输入参数: *返回值: *调用方法: */ void delay_ms(uint16_t ms) { uint16_t i,j; for( i = 0; i < ms; i++ ) { for( j = 0; j < 1141; j++ ); } } /* *函数名: __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) *描述: 写LCD寄存器(内联写寄存器,不重入压栈,加快速度) *输入参数: LCD寄存器地址和写入寄存器的值 *返回值: *调用方法: */ __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) { /* 写入寄存器16位地址然后写入寄存器的值 */ // Clr_Cs;RS=0; BANK1_LCD_REG=LCD_Reg; /* Write 16-bit Reg , RS=1*/ BANK1_LCD_RAM=LCD_RegValue; // Set_Cs; } /* *函数名: void LCD_SetCursor() *描述: 设置LCD数据写入的起始坐标0x4e--xpos,0x4f---ypos; *输入参数: LCD寄存器地址和写入寄存器的值 *返回值: *调用方法: */ void LCD_SetCursor(uint16_t Xpos , uint16_t Ypos) { LCD_WriteReg(0x004e , Xpos); LCD_WriteReg(0x004f , Ypos); } /* *函数名: LCD_GetPoint(xpos , ypos); *描述: 获取屏幕上一个点的颜色数据 *输入参数: 坐标参数 *返回值: 颜色数据 *调用方法: */ uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos) { uint16_t RGBColor=0; LCD_SetCursor( Xpos , Ypos); BANK1_LCD_REG=0x22; RGBColor=BANK1_LCD_RAM; RGBColor=BANK1_LCD_RAM; return RGBColor; } /* *函数名: LCD_SetPoint(xpos , ypos); *描述: 在屏幕上打一个点 *输入参数: 坐标参数 *返回值: *调用方法: */ void LCD_SetPoint(uint16_t Color) { BANK1_LCD_RAM=Color; } /* *函数名: LCD_SetDispArea *描述: 设置显示区域 *输入参数: 起始终止坐标 *返回值: *调用方法: */ void LCD_SetDispArea(uint16_t Xspos , uint16_t Yspos , uint16_t Xepos , uint16_t Yepos) { LCD_WriteReg(0x44,Xspos+(Xepos<<8)); /*水平坐标起始(低八位)和终止(高八位)*/ LCD_WriteReg(0x45,Yspos); /*Yspos*/ LCD_WriteReg(0x46,Yepos); /*Yepos*/ } /* *函数名: LCD_ClearArea(uint16_t Xspos , uint16_t Yspos , uint_t Xepos ,uint_t Yepos,uint16_t Color) *描述: 清屏 *输入参数: *返回值: *调用方法: */ void LCD_Clear(uint16_t Color) { int i=0; LCD_SetDispArea(0, 0,239,320); LCD_SetCursor(0 , 0); BANK1_LCD_REG=0x22; for(i=0 ; i<240*320 ; i++) { LCD_SetPoint(Color); } } void DispImag(const unsigned char *Image , unsigned int Lenth) { int i=0; uint16_t Color; LCD_SetDispArea(0, 0,239,320); LCD_SetCursor(0 , 0); BANK1_LCD_REG=0x22; if(i<Lenth/2) { Color = (u16)(Image[2*i]<<8) + Image[2*i+1]; BANK1_LCD_RAM=Color; i++; } } /* *函数名: void LCD_Init(void) *描述: 初始化LCD *输入参数: *返回值: *调用方法: 直接调用 */ void LCD_Init(void) { LCD_IOConfig(); LCD_FSMCConfig(); GPIO_ResetBits(GPIOD, GPIO_Pin_12); LCD_WriteReg(0x0000,0x0001); //打开晶振 LCD_WriteReg(0x0003,0xA8A4); //0xA8A4 LCD_WriteReg(0x000C,0x0000); LCD_WriteReg(0x000D,0x080C); LCD_WriteReg(0x000E,0x6800); LCD_WriteReg(0x001E,0x00B0); LCD_WriteReg(0x0001,0x6B3F); //驱动输出控制320*240 0x693F 0x2B3F 0x293F LCD_WriteReg(0x0002,0x0600); //LCD Driving Waveform control LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x6078); //0x4030 //定义数据格式 16位色 0x6070 横屏 0x6058 LCD_WriteReg(0x0005,0x0000); LCD_WriteReg(0x0006,0x0000); LCD_WriteReg(0x0016,0xEF1C); LCD_WriteReg(0x0017,0x0003); LCD_WriteReg(0x0007,0x0233); //0x0233 LCD_WriteReg(0x000B,0x0000); LCD_WriteReg(0x000F,0x0000); //扫描开始地址 LCD_WriteReg(0x0041,0x0000); LCD_WriteReg(0x0042,0x0000); LCD_WriteReg(0x0048,0x0000); LCD_WriteReg(0x0049,0x013F); LCD_WriteReg(0x004A,0x0000); LCD_WriteReg(0x004B,0x0000); LCD_WriteReg(0x0044,0xEF00); LCD_WriteReg(0x0045,0x0000); LCD_WriteReg(0x0046,0x013F); LCD_WriteReg(0x0030,0x0707); LCD_WriteReg(0x0031,0x0204); LCD_WriteReg(0x0032,0x0204); LCD_WriteReg(0x0033,0x0502); LCD_WriteReg(0x0034,0x0507); LCD_WriteReg(0x0035,0x0204); LCD_WriteReg(0x0036,0x0204); LCD_WriteReg(0x0037,0x0502); LCD_WriteReg(0x003A,0x0302); LCD_WriteReg(0x003B,0x0302); LCD_WriteReg(0x0023,0x0000); LCD_WriteReg(0x0024,0x0000); LCD_WriteReg(0x0025,0x8000); LCD_WriteReg(0x004e,0); //列(X)首址0 LCD_WriteReg(0x004f,0); //行(Y)首址0 } 、、、、、、、、、、、、、、这是LCD.H的、、、、、、、、、、、、、、、、、、、、、 #ifndef _LCD_H_ #define _LCD_H_ #include "include.h" /* Private define ------------------------------------------------------------*/ /* 挂载于不同的BANK,使用不同地址是自行换算 */ #define BANK1_LCD_REG (*((volatile unsigned short *) 0x60000000)) /*RS = 0 ,写寄存器值*/ #define BANK1_LCD_RAM (*((volatile unsigned short *) 0x60020000)) /*RS = 1 ,写寄存器索引*/ /* LCD Color */ #define LCD_COLOR_WHITE 0xFFFF #define LCD_COLOR_BLACK 0x0000 #define LCD_COLOR_GREY 0xF7DE #define LCD_COLOR_BLUE 0x001F #define LCD_COLOR_BLUE2 0x051F #define LCD_COLOR_RED 0xF800 #define LCD_COLOR_MAGENTA 0xF81F #define LCD_COLOR_GREEN 0x07E0 #define LCD_COLOR_CYAN 0x7FFF #define LCD_COLOR_YELLOW 0xFFE0 /** * @brief LCD Registers */ void FMSC_Init(void); void LCD_IOInit(void); void LCD_Init(void); __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue); void LCD_Clear(uint16_t Color); uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos); void DispImag(const unsigned char *Image , unsigned int Lenth); #endif
单片机跑上嵌入式系统ucosii以后,不用考虑顺序执行的问题吗
原来裸机跑的时候,写程序都是按程序执行顺序一步一步来的,加了系统不用了吗?那程序是怎么跑的呢?![图片说明](https://img-ask.csdn.net/upload/201511/19/1447925031_736813.png) 还有这个图中说道裸机的时候要考虑具体物理地址,如果是用stm32的库函数开发不是也不需要考虑的吗?跑上ucos以后是不是也是相当于他们给了一些这样的库函数,我们之间调用不用知道具体操作那些寄存器?
STM32F207ZGT中I2C SMBUS总线如何主模式读写?
STM32F207ZGT中I2C SMBUS总线如何主模式读写? 我需要使用STM32F207作为主模式,读电池的芯片BQ2060作为从模式走SMBUS总线,下面是我的一些基本设置和代码信息: void Battery_Init() { I2C_InitTypeDef I2C_InitStructure; Battery_LowLevel_Init(); /* I2C1 configuration: SMBus Host */ I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost; //设置基于SMBUS的主模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;//I2C_SLAVE_ADDRESS7=0x16从设备电池的地址 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; //I2C_SPEED=100000 /* Apply sEE_I2C configuration after enabling it */ I2C_Init(I2C1, &I2C_InitStructure); //初始化设置 /* I2C Peripheral Enable */ I2C_Cmd(I2C1, ENABLE); //使能I2C1 } //下面是我使用STM32F207ZGT作为主模式,电池芯片bq20600作为从模式,对电池芯片的进行读,代码如下: //I2Cx I2C1 //pBuffer 接收缓存 //CommandCode 字节地址 //NumByteToRead = 2读的字节数 uint32_t I2C_BatteryMasterReadbuffer(I2C_TypeDef* I2Cx,uint8_t* pBuffer, uint8_t CommandCode, uint16_t NumByteToRead) { /*----- receiver Phase -----*/ BatteryTimeout = BATTERY_LONG_TIMEOUT; while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); /* Test on I2C1 EV5 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Slave address */ I2C_Send7bitAddress(I2Cx, SMBusDefaultHeader, I2C_Direction_Transmitter);//SMBusDefaultHeader为电池地址0x16 /* Clear EV6 by setting again the PE bit */ // I2C_Cmd(I2C1, DISABLE); /* Test on I2C1 EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Command */ I2C_SendData(I2Cx, CommandCode); /*!< Test on EV8_2 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); /*!< Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Send Slave address */ I2C_Send7bitAddress(I2Cx, SMBusDefaultHeader, I2C_Direction_Receiver); /*!< Test on EV6 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } while(NumByteToRead) { if(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) //读取数据 { //调用库函数将数据取出到 pBuffer *pBuffer = I2C_ReceiveData(I2Cx); pBuffer++; //指针移位 NumByteToRead--;//字节数减 1 I2C_AcknowledgeConfig(I2Cx, ENABLE); /*!< Test on EV7 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } } if ((uint16_t)(NumByteToRead) == 1) { /* Wait on ADDR flag to be set (ADDR is still not cleared at this level */ // BatteryTimeout = BATTERY_FLAG_TIMEOUT; // while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_ADDR) == RESET) // { // if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); // } /*!< Disable Acknowledgment */ I2C_AcknowledgeConfig(I2Cx, DISABLE); /* Clear ADDR register by reading SR1 then SR2 register (SR1 has already been read) */ (void)I2Cx->SR2; /*!< Send STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); /* Wait for the byte to be received */ while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_RXNE) == RESET) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } *pBuffer = I2C_ReceiveData(I2Cx); NumByteToRead--; BatteryTimeout = BATTERY_FLAG_TIMEOUT; // while(I2Cx->CR1 & I2C_CR1_STOP) // { // if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); // } /*!< Re-Enable Acknowledgment to be ready for another reception */ I2C_AcknowledgeConfig(I2Cx, ENABLE); return Battery_OK; } } return Battery_OK; } 其中,使用F10单步跟进, 执行完 /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); I2C寄存器地址出现如下图片, 之后程序就死在了下面EV5的部分,不知道怎么解决,请求STM32高手指点: /* Test on I2C1 EV5 and clear it */ BatteryTimeout = BATTERY_FLAG_TIMEOUT; while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((BatteryTimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } ![图片说明](https://img-ask.csdn.net/upload/201506/17/1434520392_849008.jpg)
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(); }
stm32f207vc新手入门!跑马灯的程序烧录进去跑不了,求大神帮看下代码!
话不多说,下面是main.c ``` #define PERIPH_BASE ((unsigned int)0x40000000) //总线基址 #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE ((unsigned int)PERIPH_BASE + 0x00010000) #define AHB1PERIPH_BASE ((unsigned int)PERIPH_BASE + 0X00020000) #define AHB2PERIPH_BASE ((unsigned int)PERIPH_BASE + 0x10000000) //时钟基址 #define RCC_BASE ((unsigned int)PERIPH_BASE + 0x00020000 + 0x3800) //端口基址 #define GPIOE_BASE ((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000) //寄存器基址 #define RCC_AHB1ENR (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x3800 + 0x30)) #define GPIOE_BSRRL (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x38)) #define GPIOE_BSRRH (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x1a)) #define GPIOE_MODER (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x00)) #define GPIOE_OTYPER (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x04)) #define GPIOE_OSPEEDR (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x08)) #define GPIOE_PUPDR (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x0c)) #define GPIOE_BSSR (*(unsigned int *)((unsigned int)PERIPH_BASE + 0x00020000 + 0x1000 + 0x30)) unsigned short int Delay_ms(unsigned short int count); int main() { //LED初始化 RCC_AHB1ENR |= (1<<4); //端口时钟使能 GPIOE_MODER |= (1<<28); //引脚工作模式为输出 GPIOE_OTYPER |= (0<<28); //引脚输出模式为推挽 GPIOE_PUPDR |= (1<<28); //上拉模式 GPIOE_OSPEEDR |= (1<<28); //引脚工作时钟速度 GPIOE_MODER |= (1<<24); //引脚工作模式为输出 GPIOE_OTYPER |= (0<<24); //引脚输出模式为推挽 GPIOE_PUPDR |= (1<<24); //上拉模式 GPIOE_OSPEEDR |= (1<<24); //引脚工作时钟速度 GPIOE_MODER |= (1<<20); //引脚工作模式为输出 GPIOE_OTYPER |= (0<<20); //引脚输出模式为推挽 GPIOE_PUPDR |= (1<<20); //上拉模式 GPIOE_OSPEEDR |= (1<<20); //引脚工作时钟速度 GPIOE_MODER |= (1<<16); //引脚工作模式为输出 GPIOE_OTYPER |= (0<<16); //引脚输出模式为推挽 GPIOE_PUPDR |= (1<<16); //上拉模式 GPIOE_OSPEEDR |= (1<<16); //引脚工作时钟速度 /********************************************************************************/ while(1) { GPIOE_BSRRH = (1<<14); //点亮相应的LED Delay_ms(100); //函数延时 GPIOE_BSRRL = (1<<14); //熄灭相应的LED Delay_ms(100); //函数延时 GPIOE_BSRRH = (1<<12); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<12); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<10); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<10); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<8); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<8); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<8); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<8); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<10); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<10); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<12); //点亮相应的LED Delay_ms(100); GPIOE_BSRRL = (1<<12); //熄灭相应的LED Delay_ms(100); GPIOE_BSRRH = (1<<14); //点亮相应的LED Delay_ms(100); //函数延时 GPIOE_BSRRL = (1<<14); //熄灭相应的LED Delay_ms(100); //函数延时 } } /***********************************延时函数*************************************/ unsigned short int Delay_ms(unsigned short int count) { unsigned short int i=0; while(count--) { for(i=12000;i>0;i--); } return count; } ``` 如题,不知道有啥毛病
模拟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; }
stm8超声波测距为什么测的距离一直没有改变
#include <iostm8s103f3.h> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define Echo PC_IDR_IDR6 #define Trig PC_ODR_ODR5 float distance; void delay_ms(uint ms) //延时函数{ uint i,j; for(i=0;i<ms;i++) for(j=0;j<3164;j++); } void IO() //IO初始化 { PB_DDR_DDR5=0; //PB4配置为输入 PB_CR1_C15=1; //PB4为上拉电阻输入 PB_CR2_C25=0; PC_DDR_DDR6=0; PC_CR1_C16=1; PC_CR1_C16=0; } void uart1_init(void) //串口初始化 { UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; UART1_BRR2 = 0x03; UART1_BRR1 = 0x68; //9600波特率 UART1_CR2_TEN = 1; //允许发送 UART1_CR2_REN = 1; //允许接收 UART1_CR2_RIEN = 1; //接收中断使能 } void uart1_send(uchar dat) //串口发送{ while((UART1_SR & 0x80)==0x00); UART1_DR = dat; } void timer_Init(void) { TIM1_PSCRH = 0; TIM1_PSCRL = 15; //(15+1)分频为1M TIM1_ARRH = 0x0; TIM1_ARRL = 0x32; //每50us中断一次 TIM1_CCMR1_OC1M = 6; //pwm模式2 TIM1_CCER1_CC1E = 1; //CC1引脚使能 TIM1_CCR1H = 0; TIM1_CCR1L = 0; //默认输出低 TIM1_BKR |= 0x80; //设置刹车寄存器 TIM1_IER = 0x01; //允许更新中断 TIM1_CR1 = 0x01; //计数器使能,开始计数} /****千位数上的每一位数的读取*****/void uart1_int(uint distance) { char bai,shi,ge; bai=distance%100; shi=distance/10%10; ge=distance%10; uart1_send(bai+48); uart1_send(shi+48); //0x30对应的字符是‘0‘,数字加上0X30后为数字所对应的Ascall码 uart1_send(ge+48); uart1_send(0x0a); //0X0a对应的字符是换行\n} /*********** 定时器计数 ***********/void calc(){ //0..034cm/us int t=0; t=TIM1_CCR1H*256+TIM1_CCR1L; distance=t*0.017; TIM1_CCR1H = 0; TIM1_CCR1L = 0; uart1_int(distance); } void Trigger() { Trig=1; TIM1_ARRH = 0x0; TIM1_ARRL = 0x32; Trig=0;} void main(void){ CLK_CKDIVR &=0xe7; //配置时钟为16MHz asm("sim"); //关总中断 IO(); //IO uart1_init(); timer_Init(); asm("rim"); //开总中断 while(1) { Trigger(); //发送触发信号 while(Echo) TIM1_CR1 = 0x01; //启动定时器 while(!Echo) TIM1_CR1 = 0x00; //关闭定时器 calc(); //计算 uart1_send(0x0a); }}#pragma vector = UART1_R_RXNE_vector__interrupt void uart1rxd(void){ UART1_SR_RXNE = 0; //data = UART1_DR;} #pragma vector = TIM1_OVR_UIF_vector__interrupt void TIM1_OVR_UIF(void){ TIM1_SR1_UIF = 0; //add your code here}
在STM32上做SPI方式的ADXL345程序,无法读出ID,全是FF?
![图片说明](https://img-ask.csdn.net/upload/201906/27/1561593720_113653.jpg) 我用的ADXL345在淘宝上买的,型号是GY291 #ifndef __SPI_H #define __SPI_H #include "sys.h" void SPI1_Init(void); //初始化SPI1口 void SPI1_SetSpeed(u8 SpeedSet); //设置SPI1速度 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "spi.h" #include "delay.h" //以下是SPI模块的初始化代码,配置成主机模式 //SPI口初始化 //这里针是对SPI1的初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟 //GPIOFA5,6,7初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_4;//PA4片选 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PB3复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PB4复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PB5复用为 SPI1 //这里只针对SPI口初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1 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_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_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 GPIO_SetBits(GPIOA,GPIO_Pin_4); SPI_Cmd(SPI1, ENABLE); //使能SPI外设 // SPI1_ReadWriteByte(0xff);//启动传输 } //SPI1速度设置函数 //SPI速度=fAPB2/分频系数 //@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescaler_256 //fAPB2时钟一般为84Mhz: /* 初始化包括了spi速度在内的各种参数,而速度设置函数,则只设置SPI的速度,方便在代码里面调用. 比如sd卡例程,在SD卡初始化的时候,SPI频率必须比较低,但是初始化成功以后,就可以设置到很高了. 这个时候调用SPI速度设置函数,就比较方便. */ void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler) { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性 SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率 SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 SPI_Cmd(SPI1,ENABLE); //使能SPI1 } //SPI1 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI1_ReadWriteByte(u8 TxData) { u8 val,val1; GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val1=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); delay_ms(2); GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, 0XFF); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); return val+val1; //返回通过SPIx最近接收的数据 } #ifndef __ADXL345_H #define __ADXL345_H #include "spi.h" #define DEVICE_ID 0X00 //器件ID,0XE5 #define THRESH_TAP 0X1D //敲击阀值 #define OFSX 0X1E #define OFSY 0X1F #define OFSZ 0X20 #define DUR 0X21 #define Latent 0X22 #define Window 0X23 #define THRESH_ACK 0X24 //有误,THRESH_ACT #define THRESH_INACT 0X25 #define TIME_INACT 0X26 #define ACT_INACT_CTL 0X27 #define THRESH_FF 0X28 #define TIME_FF 0X29 #define TAP_AXES 0X2A #define ACT_TAP_STATUS 0X2B #define BW_RATE 0X2C #define POWER_CTL 0X2D #define INT_ENABLE 0X2E #define INT_MAP 0X2F #define INT_SOURCE 0X30 #define DATA_FORMAT 0X31 #define DATA_X0 0X32 #define DATA_X1 0X33 #define DATA_Y0 0X34 #define DATA_Y1 0X35 #define DATA_Z0 0X36 #define DATA_Z1 0X37 #define FIFO_CTL 0X38 #define FIFO_STATUS 0X39 u8 ADXL345_Init(void); //初始化ADXL345 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "adxl345.h" #include "sys.h" #include "delay.h" #include "math.h" #include "usart.h" //初始化ADXL345. //返回值:0,初始化成功;1,初始化失败. u8 ADXL345_Init(void) { u8 ID; SPI1_Init(); //初始化IIC总线 if(SPI1_ReadWriteByte(DEVICE_ID)==0XE5) //读取器件ID { printf("\r\nDEVICE_ID=%0x",ID); return 0; } printf("\r\n失败DEVICE_ID=%0x",ID); return 1; } //读ADXL345寄存器 //addr:寄存器地址 //返回值:读到的值 #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "lcd.h" #include "adxl345.h" #include "math.h" int main(void) { delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 LED_Init(); //初始化与LED连接的硬件接口 while(1) { while(ADXL345_Init()) //3D加速度传感器初始化 { delay_ms(1000); } } } ```
请大神看一下我的代码还缺什么文件,该怎么改啊
#include"stm8s.h" #include"stm8s_UART1.h" #include"stm8s_clk.h" #include"stm8s_conf.h" #include"iostm8s003k3.h" typedef unsigned char uint8; typedef unsigned char uint16; uint8 num=0; /************************************************************************/ * 功能:时钟配置初始化 * 形参:无 * 返回:无 /************************************************************************/ void CLK_Init(void) { /*对于内部高速时钟HSI[16MHz],其逻辑关系是HSI---[HSIDIV分频]---[时钟选择门]--- * 主时钟Fmaster---{[CPUDIV分频]---Fcpu时钟;其他外设时钟} */ CLK_ICKR = 0x01; //Internal clock control register。复位值,使能HSI时钟,快速唤醒禁止 CLK_ECKR = 0x00; //External clock control register。HSE禁止。 CLK_SWR = 0xE1; //Clock master switch register。选择HSI为主时钟。 CLK_SWCR = 0x00; //Clock switch control register。时钟切换,中文数据手册翻译似乎有误 /*Clock divider register。分频Fmaster和Fcpu。 * 默认是8和1,现在是2和1,因此Fmaster=8M,Fcpu=8M */ CLK_CKDIVR = 0x08; CLK_PCKENR1 = 0xFF; //Peripheral clock gating register 1。Fmaster与外设时钟连接 CLK_PCKENR2 = 0x0; //同上 CLK_CSSR = 0x0; //Clock security system register。时钟安全检测关 CLK_CCOR = 0x0; //Configurable clock control register。时钟输出关闭 } //****************************************/ // 函数名称:Init_Uart1 // 函数功能:串口寄存器初始化 // 入口参数:波特率值 // 出口参数:无 // 返 回 值:无 //***************************************/ void Uart1_Init(uint16 Tcon) { uint8 Tmp1 = 0 ; uint8 Tmp2 = 0 ; //禁止UART发送和接收 UART1_CR2 =0 ; //M=0 8个数据位 b2=0,禁止校验 b5=0,UART使能 UART1_CR1 = 0 ; UART1_CR3 = 0 ; // b5 b4 = 00 ,一个停止位 //波特率设置,先写UART_BRR2 再写UART_BRR1 // F = 9600, 分频为:16M/9600 = 1666.7 -> 0X0683 Tmp1 = (uint8)((Tcon >> 4) & 0x00ff) ; Tmp2 = (uint8)((Tcon & 0x000f)|((Tcon >> 8) & 0x00f0)); UART1_BRR2 = Tmp2; UART1_BRR1 = Tmp1 ; //允许发送 允许接收 接收中断使能 × UART1_CR2 |= (REN | TEN | RIEN); } main() { CLK_Init(); · UART1_init(); while(1); } //***************************************/ // 函数名称:UartSendByte // 函数功能:串口发送一字节数据 // 入口参数:要发送的数据 // 出口参数:无 // 返 回 值:无 //***************************************/ void UartSendByte(uint8 num) { × while(!(UART1_SR & TXE));//发送数据寄存器为非空 等待 . UART1_DR =num ; } //*************************************************************/ // 函数名称:Uart1ReceByte // 函数功能:串口接收一字节数据 // 入口参数:无 // 出口参数:接收到的数据 // 返 回 值:返回是否接收到数据 接收到数据返回1,未接到返回0 //*************************************************************/ void Uart1ReceByte(uint8 num) { × if((UART1_SR & RXNE) != 0);//读数据寄存器为非空 说明有数据进来 { × UART1_SR &= ~RXNE ; num = UART1_DR ; num++; UART1_DR =num ; × REN=0; } } (×:表示有错的地方; · :表示警告) 编译结果: Building configuration: mbv - Debug Updating build tree... main.c Warning[Pe009]: nested comment is not allowed I:\我的项目\项目1\项目内容\MBV\main.c 17 Error[Pe020]: identifier "REN" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 65 Error[Pe020]: identifier "TEN" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 65 Error[Pe020]: identifier "RIEN" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 65 Warning[Pe223]: function "UART1_init" declared implicitly I:\我的项目\项目1\项目内容\MBV\main.c 72 Error[Pe020]: identifier "TXE" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 87 Error[Pe020]: identifier "RXNE" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 100 Error[Pe020]: identifier "RXNE" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 102 Error[Pe020]: identifier "REN" is undefined I:\我的项目\项目1\项目内容\MBV\main.c 106 Error while running C/C++ Compiler Total number of errors: 8 Total number of warnings: 2
AVR单片机 驱动SS1306 SPI模式点不亮屏幕
网上到处都是51 和stm32的例程,AVR的完全找不到,移植了51的例程, 但是就是点不亮oled。主芯片是atmega128 走的是spi模式。程序代码如下,不用库单独画点都完全没反应,实在找不出是啥子原因。跪求解答 ``` #include <iom128.h> #include <delay.h> #include <oledfont.h> //8位LED灯控制端口定义,连接在PE口,灌电流模式 #define LED PORTE //PE口接8个LED灯 #define LEDDDR DDRE //PE口方向寄存器 #define LED4_0 PORTE &= ~(1<<PE3) //D4亮 #define LED4_1 PORTE |= (1<<PE3) //D4灭 #define u8 unsigned char #define u32 unsigned int #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 #define OLED_RST_Clr() PORTE &= ~(1 << PE6) #define OLED_RST_Set() PORTE |= (1 << PE6) #define OLED_DC_Clr() PORTE &= ~(1 << PE5) #define OLED_DC_Set() PORTE |= (1 << PE5) #define OLED_SCLK_Clr() PORTB &= ~(1 << PB1) #define OLED_SCLK_Set() PORTB |= (1 << PB1) #define OLED_SDIN_Clr() PORTB &= ~(1 << PB2) #define OLED_SDIN_Set() PORTB |= (1 << PB2) #define SIZE 16 #define XLevelL 0x02 #define XLevelH 0x10 #define Max_Column 128 #define Max_Row 64 #define Brightness 0xFF #define X_WIDTH 128 #define Y_WIDTH 64 u8 OLED_GRAM[8][128]; //8页 128列 void OLED_WR_Byte(u8 dat,u8 cmd); void OLED_Set_Pos(unsigned char x, unsigned char y) ; void OLED_Set_Pos(unsigned char x, unsigned char y) ; void OLED_Display_On(void); void OLED_Display_Off(void); void OLED_Clear(void); void OLED_DrawPoint(u8 x,u8 y,u8 t); void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot); void OLED_ShowChar(u8 x,u8 y,u8 chr); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2); void OLED_ShowString(u8 x,u8 y, u8 *p); void OLED_Set_Pos(unsigned char x, unsigned char y); void OLED_ShowCHinese(u8 x,u8 y,u8 no); void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]); void OLED_Init(void); void system_init(); void Print_Point(u8 x, u8 y,u8 checkedState); void system_init() { LEDDDR=0xff; //设置PE口为输出 LED=0xff; //初始状态为高,关闭8个LED灯 } //向SSD1306写入一个字节单位 //dat:要写入的数据/命令 //cmd:数据/命令标志 0命令 1数据 void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); //OLED_CS_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) { OLED_SDIN_Set(); } else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; } //OLED_CS_Set(); OLED_DC_Set(); } void OLED_Set_Pos(unsigned char x, unsigned char y) //坐标位置 { OLED_WR_Byte(0xb0+y,OLED_CMD);//页 OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高四位 OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); //低四位 } //开启OLED显示 void OLED_Display_On(void) { OLED_WR_Byte(0X8D,OLED_CMD); //电荷泵设置 OLED_WR_Byte(0X14,OLED_CMD); //打开电荷泵 OLED_WR_Byte(0XAF,OLED_CMD); //开启显示 } //关闭OLED显示 void OLED_Display_Off(void) { OLED_WR_Byte(0X8D,OLED_CMD); OLED_WR_Byte(0X10,OLED_CMD);//关 A2 OLED_WR_Byte(0XAE,OLED_CMD); } //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示 } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr) { unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1){x=0;y=y+2;} if(SIZE ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } else { OLED_Set_Pos(x,y+1); for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA); } } //m^n函数 u32 oled_pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //size:字体大小 //mode:模式 0,填充模式;1,叠加模式 //num:数值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) { u8 t,temp; u8 enshow=0; for(t=0;t<len;t++) { temp=(num/oled_pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size2/2)*t,y,' '); //OLED_ShowChar(x+(size2/2)*t,y,' ',size2);//IIC程序中的 continue; }else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); } } //显示一个字符号串 void OLED_ShowString(u8 x,u8 y,u8 *chr) { unsigned char j=0; while (chr[j]!='\0') { OLED_ShowChar(x,y,chr[j]); x+=8; if(x>120){x=0;y+=2;} j++; } } //显示汉字 void OLED_ShowCHinese(u8 x,u8 y,u8 no) { u8 t,adder=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1; } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1; } } /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y; if(y1%8==0) y=y1/8; else y=y1/8+1; for(y=y0;y<y1;y++) { OLED_Set_Pos(x0,y); for(x=x0;x<x1;x++) { OLED_WR_Byte(BMP[j++],OLED_DATA); } } } void Print_Point(u8 x, u8 y,u8 checkedState) { OLED_Set_Pos(x,y); if(checkedState == 1) { OLED_WR_Byte(0xC0,OLED_DATA); OLED_WR_Byte(0xC0,OLED_DATA); } else { OLED_WR_Byte(0x00,OLED_DATA); OLED_WR_Byte(0x00,OLED_DATA); } } //初始化SSD1306 void OLED_Init(void) { //OLED_CS_Set(); OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(100); OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address低列地址 OLED_WR_Byte(0x10,OLED_CMD);//---set high column address高列地址 OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)起始行地址 OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register对比度 OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness对比度/亮度值 OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display A6:正常/A7:反相 OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)驱动路数 OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty驱动路数值 OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)设置显示偏移 OLED_WR_Byte(0x00,OLED_CMD);//-not offset设置显示偏移值 OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency 设置时钟分频因子,震荡频率 OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period设置预充电周期 OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration设置COM硬件引脚配置 OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh设置VCOMH倍率 //OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)设置内存地址模式 OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10; OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable电荷泵设置///////////手册上没找到 OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disablebit2,开启/关闭 OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 设置显示方式;bit0:1,反相显示;0,正常显示 OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel开启显示 OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); //OLED_Set_Pos(0,0); } int main(void) { // u8 t; system_init(); OLED_Init(); // OLED_Clear(); // OLED_ShowString(30,0,"OLED TEST"); // OLED_ShowString(8,2,"ZHONGJINGYUAN"); // OLED_ShowString(20,4,"2014/05/01"); // OLED_ShowString(0,6,"ASCII:"); // OLED_ShowString(63,6,"CODE:"); // t=' '; OLED_Display_On(); delay_ms(10000); while(1) { Print_Point(3,5,1); LED = 0xFF; PORTE &= ~(1<<PE3); OLED_Clear(); OLED_ShowCHinese(0,0,0);//中 OLED_ShowCHinese(18,0,1);//景 OLED_ShowCHinese(36,0,2);//园 OLED_ShowCHinese(54,0,3);//电 OLED_ShowCHinese(72,0,4);//子 OLED_ShowCHinese(90,0,5);//科 OLED_ShowCHinese(108,0,6);//技 } } ```
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
【资源】一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)【内附资源页】
声明: 1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
神级宝库!GitHub 标星 1.2w+,Chrome 最天秀的插件都在这里啦!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个沉迷 Chrome 不能自拔的蒟蒻… 作为一个在远古时代用过什么 IE、360、猎豹等浏览器的资深器哥,当我第一次了解 Chrome 的时候,就被它的美貌给吸引住了… 就在我用了一段时间之后,我坚决的卸载了电脑上其它碍眼的浏览器,并觉得在之前的搬砖生涯中,我不配当哥,我只配是个沙雕… ...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
立即提问