一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: xjw01
收起左侧

stm32怎么学

  [复制链接]
 楼主| 发表于 2012-12-2 18:46 | 显示全部楼层
回复 70# holts

没有使用F0的原因是:
1、少买了一个mini USB线。
2、我没能下载到相对完整的STM32F0编程工具、教学资料。可能是使用F0的人比较少造成的。
stm32F103,网上资料多。
试了几个程序,虽然遇到不同版本函数库兼容问题,得修改程序才能运行,但是,必竟有了样本程序可供我参考。
ST也有范例程程序,但都是统一格式做出来,含有一大堆我们不需要的信息,影响阅读。
3、我在买F0之后,跟据前几楼的建议,也查阅了F103资料,利用DMA,可以做出频率很高的PWM,这样就解决了DDS问题。
PWM的精度,可以做得比直接DAC更高的精度。PWM做DAC主要由时间精度决定及端口内阻决定,直接DAC,则要求DAC本身高质量。所以,我马上在淘宝上补拍了F103的最小系统。
4、我觉得,F103比较容易,所以先试一下F103,以后再试F0的。
发表于 2012-12-2 22:34 | 显示全部楼层
回复 68# xjw01


  许老师,我觉得玩电子的,初学忌贪多,以您的功力肯定可以把芯片话腐朽为神奇,当时就没在您之前说买一套带tft的开发板,也就200元左右可以搞定,可以学习好多例程,f103已经出来5年了,各方面都很成熟。 晶振您就用8mhz外置晶振,建议boot1接地,boot0按需求,10k电阻限流vcc进入isp下载,接gnd运行用户程序。
有什么问题,大家肯定愿意倾心帮助的。
 楼主| 发表于 2012-12-2 23:01 | 显示全部楼层
回复 72# lichuang1005

谢谢。

我现在,把boot0和boot1改为非自锁开关,不用跳冒。
开机时,按住开关,然后上电,再然后放放手。STM32就进入编程下载状态。
下载时,把“擦除”选项、“Jump到用户程序”选项钩上,这样,每次都下载成功了。
 楼主| 发表于 2012-12-2 23:28 | 显示全部楼层
回复 72# lichuang1005

“以您的功力肯定可以把芯片话腐朽为神奇”

你过讲了。我对数字电路并不熟。单片机也是初学者。

几年前,我设计了一个高精度天文历算程序,发布在网络上。后来,有厂商向我求助,他们要开发能够自动跟踪任意星体的望远镜,精确到角秒数量级即可。我拒绝了,我对他说,我只会51,而51单片机的计算能力不够,无法进行天文计算。

今年设计电桥,坛友提起stm32,我查一下stm32,原来它就是ARM。我曾在苹果手机上试了一下我设计《寿星天文历》,速度超快,我对ARM映象深刻。今天让我明白,STM32是ARM的一种,所以决定学习一下STM32

我对数值计算,是比较自信的,原于对数值计算及数理方法的理解。当我设计好《寿星天文历》(当时利用google查阅了大量外文资料才设计出来),这才发现,国内的天算,都是抄外国人的,不管是书籍还是算法,包括论文,基本上是抄美、英、法的。我心目中的“中科院”不再那么神奇,他们设计电桥,我也想设计一下平民电桥,反正做这个东西也花不了多少钱。
发表于 2012-12-3 00:20 | 显示全部楼层
回复 73# xjw01


    那建议您做两个非自锁按键,boot1接地  boot0下拉 按键接vcc ,一个按键是rest。 按下boot0按键再复位进入isp 再次复位正常工作。
告诉我地址借给您stm32f4discovery 官方演示板吧,告诉我您的地址,那个带dfu,相信您能够化腐朽为神奇,miniusb线我可以附赠,microusb现在手机基本都是,就不附赠了。
其实f103也有dfu代码好像,我可以帮忙查找。
运算量大建议用ds,哈哈。stm32f103属于高性价比的了,其实可以花钱买个安福来的开发板,就是199003326从考拉手里收购来的https://www.yleee.com.cn/thread-19951-1-1.html
淘宝价格尚可,建议用这个先上手,最小系统以后做实验再用,硬件电路可以参考别人的布置,要不就可能出现一些麻烦,
估计您的那个晶振要用8mhz的,最高能够16倍频(8x16 超频使用,但是功能性基本没问题) 9倍频 72mhz正常应用
站内信给我您地址吧,送人玫瑰手有余香。
安福来的那个板子有个好处就是用的是64脚的芯片,原配的是rb  128k flash 20kram    换成stm32f103rct6  变成了 256k flash 48kram  还有sdio
芯片更换难度也还行吧。价格不是太贵 15-17元左右一片芯片。
自己动手从底层硬件开始有点累。因为这个芯片的外围要比51麻烦,怎么说也是一个32位单片机啊。
 楼主| 发表于 2012-12-3 08:54 | 显示全部楼层
回复 75# lichuang1005


    谢谢你。
我现在先学习一些基础的。先使用最小系统。
以后如果要学习操作系统,再向你借。

据说win8也开始跨平台了,现在的Linux或win8,能否装入stm32?
发表于 2012-12-3 13:01 | 显示全部楼层
回复 76# xjw01


    可以在Linux下用 GCC 开发 STM32
发表于 2012-12-3 22:04 | 显示全部楼层
回复 76# xjw01


    等到明年win8正式发行的适合 mdk和 iar肯定都会支持win8的,linux下面就用gcc吧。
 楼主| 发表于 2012-12-4 07:47 | 显示全部楼层
本帖最后由 xjw01 于 2012-12-4 07:55 编辑

这两天调试了 LED驱动(GBIO操作)、TIM3、TIM3_PWM、TIM寄存器值动态修改(不使用库)、TIM3_PWM_DMA
其中TIM3_PWM_DMA没有成功,DMA没有启动,原因不详,可能是通道选择有误。
 楼主| 发表于 2012-12-4 10:10 | 显示全部楼层
设计了以下DMA控制PWM输出,但是工作异常,DMA无效,不知何故

/************************
实验目标:
1、在PA_6端口输出PWM,占空比是反复变化的
2、PWM占空比由buf[3]决定,循环改变占空比,即三个占空比不断变换
3、由DMA控制TIM3->CCR1实现占空比循环改变
简易验证:
10k欧限流LED接到PA_6
buf[]置为{950, 500, 100},约应得到500亮度,实得950亮度(很暗),说明DMA异常
buf[]置为{100, 500, 950},约应得到500亮度,实得100亮度(很亮),说明DMA异常
*************************/

#include "stm32f10x.h"

u16 buf[3] = {950, 500, 100};

void DMA_Configuration(void)
{
  DMA_InitTypeDef D;

  //详见函数库手册第90页解释
  DMA_DeInit(DMA1_Channel3); //DMA1_3通道初始化
  D.DMA_PeripheralBaseAddr = (u32)0x40000434;      //DMA外设基址 TIM3_CCR1_Address
  D.DMA_MemoryBaseAddr = (u32)buf;                 //DMA内存基址
  D.DMA_DIR = DMA_DIR_PeripheralDST;               //DST外设作为数据传送目的地址,SRC则作为源地址
  D.DMA_BufferSize = 3;                                   //DMA缓存大小
  D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不增加
  D.DMA_MemoryInc = DMA_MemoryInc_Enable;          //内存地址寄存器不增加
  D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外存字宽16bit
  D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;              //内存字宽16bit
  D.DMA_Mode = DMA_Mode_Circular;          //工作在循环模式
  D.DMA_Priority = DMA_Priority_High; //DMA置为高优先级
  D.DMA_M2M = DMA_M2M_Disable;                  //不置为内存到内存传输
  DMA_Init(DMA1_Channel3, &D);                  //初始化DMA1
  DMA_Cmd(DMA1_Channel3, ENABLE);     //DMA1_3使能

}

static void GPIO_Config(void)
{                                                          
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         //TIM3钟源
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);  //PA、PB钟源

  //GPIOA 配置: TIM3 channel 1 和 2 推挽复用
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


int main(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  SystemInit();//配置系统时钟为72MHz
  GPIO_Config(); //配置端口
  DMA_Configuration(); //配置DMA

  //定时器设置
  TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //设置预分频:不预分频,即为36MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  //TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  //PWM通道1模式设置
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = buf[0];           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1

  TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE); //TIM3 DMA请求使能,注:TIM3_Update请求对应DMA通道为DMA1_chanel3
  //TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE); //TIM3 DMA请求使能,注:TIM3_CC1请求对应DMA通道为DMA1_chanel6
  TIM_Cmd(TIM3, ENABLE); //TIM3使能
  //TIM_CtrlPWMOutputs(TIM3, ENABLE); //PWM输出

  while (1){}
}

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-29 02:59 , Processed in 0.047912 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表