请问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小白求助
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); } } } ```
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);//技 } } ```
请大神看一下我的代码还缺什么文件,该怎么改啊
#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
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Java描述设计模式(19):模板方法模式
本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。 public class C01_InScene { public static void main(String[] args) { DevelopApp developApp = n...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char name[20] = "黑蛋"; //玩家名字 int...
第三个java程序(表白小卡片)
前言: &nbsp;向女神表白啦,作为一个程序员,当然也有爱情啦。只不过,虽然前面两个程序都只是学习了基础的语法结构和向量哈希表。这里涉及的是Swing,awt图形用户界面和一点文件输入输出流的知识。 &nbsp; 表白代码如下: 另附:里面的音乐和图片可以放在一个自己创建的包里面,也可以放在src里面,或者使用绝对路径。至于布局,我自己的使用的是简单的排班,简单的继承。后面的程序会慢慢实现。 ...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
化繁为简 - 腾讯计费高一致TDXA的实践之路
导语:腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,在如此庞大的业务体量下,腾讯计费要支撑业务的快速增长,同时还要保证每笔交易不错账。采用最终一致性或离线补...
Linux网络服务-----实验---PXE和Kickstart的无人值守装机
目录 一.PXE的原理 二.kickstart的原理 三.PXE与kickstart的结合使用自动装机 一.PXE的原理 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由支持通过网络启动操作系统,再启动过程中,终端要求服务器分配IP地址...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
A*搜索算法概述
编者按:本文作者奇舞团前端开发工程师魏川凯。A*搜索算法(A-star search algorithm)是一种常见且应用广泛的图搜索和寻径算法。A*搜索算法是通过使用启...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
从顶级黑客到上市公司老板
一看标题,很多老读者就知道我在写什么了。今天Ucloud成功上市,季昕华成为我所熟悉的朋友里又双叒叕一个成功上市的案例。我们认识大概是十五年多吧,如果没记错,第一次见面应该是2004年,...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
疫情防控,开发者集结出战!
作者 | 屠敏出品 | CSDN(ID:CSDNnews)2020 年伊始,病毒肆虐,人心惶惶。截止北京时间 1 月 31 日 15 时 30 分,全国确诊新型冠状病毒肺炎的数字已达到了...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问