
stm32单片机可以用Keil5、STM32CubeIDE、IAR等进行编程。
1、Keil MDK:Keil支持目前大多数单片机,Keil根据不同内核单片机,分为几个版本,最常用的就是Keil C51和MDK-ARM。像STC和一些51内核的单片机,一般用KeilC51版本,STM32则用的MDK-ARM。
2、STM32CubeIDE:STM32CubeIDE是ST公司推出的免费多功能STM32开发工具,可以说专门为STM32而生,新增了很多STM32专用功能,比如说外设图形化配置。为工程师大大提高开发效率,降低开发成本。
3、IAR:IAR我是在开发Ti蓝牙产品和基于STM8单片机会用到的。IAR也可以用来开发STM32的程序。通过IAR编译出来的程序比Keil优化得更好,最直接的体现就是编译出来的程序更节约内存空间。和上面Keil类似,IAR同样支持很多单片机,有很多功能基本两者都有。
STM32的介绍:
在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。
内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。
意法半导体(STMicroelectronics)整个集团共有员工近50000名,拥有16个先进的研发机构、39个设计和应用中心、15主要制造厂,并在36个国家设有78个销售办事处。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);
返回输入端口某个引脚的状态
GPIOx: x (A~G)
GPIO_Pin: 端口的哪个bit位需要读取 (0~15)
如GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0); 读A0的状态,返回值可能0 或 1
uint16_t GPIO_ReadInputData(GPIO_TypeDef GPIOx);
如GPIO_ReadInputData(GPIOA); 返回A0~A15的状态
STM32不同地址里的程序运行的LED0=0这条C指令编译器把它转换成了3条汇编指令MOVS、LDR、STR,这三句汇编分别对应的机器码就是2000、490B、6008。
STM32不同地址一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
STM32不同地址大端模式:
STM32不同地址所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。
例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)。
下面是我的VS1003b_Init代码:
void My_VS1003b_Init()
{
u16 uReadVal = 0;
My_VS1003b_GPIOConfig();
My_SPI_Init(SPI1);
SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_16); //在模块为初始化之前SCLKI = 12MHZ,SPI允许的通信速率为SCLKI/6= 2MHZ
//SDI、SCI为SCLKI/4
// My_VS1003b_ExitConfig();
My_VS1003b_HardReset();
XDCS_H;
XCS_H;
My_TimeDelay(2);
My_VS1003b_WriteSCI(MODE,0x08,0x00);//软件复位,向0号寄存器写入0x0804 SM_SDINEW为1 SM_RESET为1 SM_DIFF为1环绕声
while(My_VS1003b_GetDREQState() == LOW);
My_VS1003b_WriteSCI(CLOCKF,0x98,0x00); //设置 VS1003 的时钟:例如SCI_CLOCKF=0x9800,向3号寄存器写入0x9800
//100 11 000 0000 0000 SC_MULT 为4 SC_ADD 为3 SC_FREQ为 0
// 设置完以后XTAIL不变,SCLKI = XTAILSC_MULT = 36MHZ,编解码速率 SCLKI15 = 48MHZ;
uReadVal = My_VS1003b_Read(CLOCKF);
uReadVal += 0 ;
// SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_8);
My_VS1003b_WriteSCI(AUDATA,0xBB,0x81); //设置 VS1003 的采样率:SPI_AUDATA=0xbb81,采样率 0xBB80 48k,0x0001立体声
uReadVal = My_VS1003b_Read(AUDATA);
uReadVal += 0 ;
My_VS1003b_WriteSCI(BASS,0x00,0x00); //SPI_BASS=0x0055,重音设置,向2号寄存器写入0x0055
//SB_AMPLITUDE=5 SB_FREQLIMIT=5 低于50Hz时进行5dB的增强
uReadVal = My_VS1003b_Read(BASS);
uReadVal += 0 ;
My_VS1003b_WriteSCI(VOL,VOL_VALUE,VOL_VALUE); //初始设置音量:SCI_VOL=0x2020 左右声道相同
// while(1)
// {
// uReadVal = My_VS1003b_Read(VOL);
// uReadVal += 0 ;
// }
// VS1003_ResetDecodeTime();
SPI_WriteByte(SPI1,0); //SDI测试
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
while(My_VS1003b_GetDREQState() == LOW);
VS1003_Sintest(5);
}
SPI初始化代码:
GPIO初始略过。。。
SPI_InitStructSPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructSPI_Mode = SPI_Mode_Master;
SPI_InitStructSPI_DataSize = SPI_DataSize_8b;
SPI_InitStructSPI_CPOL = SPI_CPOL_Low;
SPI_InitStructSPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructSPI_NSS = SPI_NSS_Soft;
SPI_InitStructSPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructSPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructSPI_CRCPolynomial = 7;
SPI_Cmd(pstSPIx,DISABLE);
SPI_Init(pstSPIx,&SPI_InitStruct);
SPI_Cmd(pstSPIx,ENABLE);
由于我的HCLK = 36MHZ,所以此处为16分频。。。。
这是我的100b 的 GPIO_Init代码:
void My_VS1003b_GPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructGPIO_Pin = VS1003b_DREQ;
GPIO_InitStructGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructGPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStructGPIO_Pin = VS1003b_XDCS | VS1003b_XCS | VS1003b_RSET;
GPIO_InitStructGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructGPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
1003b 读写模块函数:
u16 My_VS1003b_Read(u8 uAddress)
{
u16 uReturnVal = 0;
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Read);
SPI_WriteByte(SPI1,uAddress);
uReturnVal = (SPI_ReadWriteByte(SPI1,0xff) << 8);
uReturnVal |= SPI_ReadWriteByte(SPI1,0xff);
My_VS1003b_SCIStop();
return uReturnVal;
}
void My_VS1003b_WriteSDI(u8 uAddress,u8 uVal)
{
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SDIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_ReadWriteByte(SPI1,uVal % 0x100);
My_VS1003b_SDIStop();
My_TimeDelay(1);
}
void My_VS1003b_WriteSCI(u8 uAddress,u8 uHbyte,u8 uLbyte)
{
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_WriteByte(SPI1,uHbyte);
SPI_WriteByte(SPI1,uLbyte);
My_VS1003b_SCIStop();
My_TimeDelay(1);
}
以上就是关于stm32用什么软件编程全部的内容,包括:stm32用什么软件编程、STM32程序问题、STM32不同地址里的程序运行的是哪一个等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)