-
请到 http://sites.google.com/site/btvnlue/stm32 搜索所需源码
-
可行的
-
内部中断设置也相对简单,而中断处理程序需要对停止标志进行设置,并且需要将相应的中断源作处理这里以DMA的内存到内存(MEM2MEM)为例,中断响应中需要将DMA停止,并且将中断事件位清除,否则会被持续调用DMA Handler*dma1_ccr1 = 0x40C2; // PL:low M/PSIZE:8bit M/PINC:yes Circ:no Dir:P->M TCIE:yes*nvic_iscr0 = 0x800; //enable IRQ11*nvic_icpr0 = 0x800;*nvic_iser0 = 0x800;*dma1_cndtr1 = DMA_Buffer_Size;*dma1_ccr1 |= 0x1;if ((*dma1_isr&0x01)==0x01) { *dma1_ccr1 &= ~0x1; DMA_Int_Flag = *dma1_isr; *dma1_ifcr = DMA_Int_Flag;}外部中断不但需要对中断控制寄存器进行设置,还需要对外部中断进行映射,即EXTI0~EXTI15响应GPIO A~F的映射,然后设置外部中断控制器响应程序也需要将中断准备控制器清除,否则会被持续调用代码使用LED1、2线为外部中断响应,由于电路设计GPIO的低电平点亮LED,设置EXTI的上升沿即是LED由亮到灭响应中断EXTI Process*afio_exticr1 &= ~0xFF00;*afio_exticr1 |= 0x3300; //EXT2/3 map PD*afio_exticr2 &= ~0xF;*afio_exticr2 |= 0x2; //EXT4 map PC*exti_imr &= ~0x1C;*exti_emr &= ~0x1C;*exti_pr = 0x1C;*exti_rtsr &= ~0x1C;*exti_rtsr |= 0x1C;*nvic_iscr0 = 0x700; //enable IRQ8 IRQ9 IRQ10*nvic_icpr0 = 0x700;*nvic_iser0 = 0x700;*exti_imr |= 0x1C; //not mask exti2/3/4if ((*exti_pr&0x8)==0x8) { *exti_pr = 0x8;优先级的设置需要两个步骤优先级分组控制器和优先级控制器这里使用最细化分组0x7,优先级控制器虽然是以字节为单位,但只有高4位被使用[7:4],数字越低,优先级越高Interrupt Priority*scb_aircr = 0x05FA0700; //group use 4bit detailnvic_ipr[8] = 0x20; //set IRQ8=2nvic_ipr[9] = 0x10; //set IRQ9=1light_led(0, 0x3); //raise EXTI2/3 same time
-
__MICROLIB在工程设置页中有MicroLib的选项,如printf之流的库函数都在其中。找不到再回来,给你贴图__use_two_region_memory使堆与栈分开管理,非ARM标准标志,Keli特有
-
CMD17 Read Block sd_cs(0); sd_command(cmd, cc); rtn = sd_response(); if (rtn==0x00) { rtn = sd_data_token(); if(rtn==0xFE) { for (cc=0; cc<512; cc++) { data[cc] = 0xAA; data[cc] = sd_bytedata(0xFF); } sd_bytedata(0xFF); sd_bytedata(0xFF); } rtn=0; } sd_cs(1);CMD24 Write Block sd_cs(0); sd_command(cmd, cc); rtn = sd_response(); if (rtn==0x00) { sd_bytedata(0xFF); sd_bytedata(0xFE); for (cc=0; cc<512; cc++) { sd_bytedata(data[cc]); } sd_bytedata(0xFF); sd_bytedata(0xFF); rtn = sd_response(); cc = 0; while (rtn == 0x00) { //R1b busy rtn = sd_bytedata(0xFF); cc++; } } sd_cs(1);
-
CMD0SD卡上电后使用CMD0进入SPI模式,CMD0的返回值是1字节的R1,R1应该为空闲0x01CMD0 sd_cs(0); sd_command(cmd, cc); res=sd_response(); sd_cs(1);while ((rtn!=0x01)CMD8版本2.0以上的SD卡支持CMD8命令,包括大部分SDHC的卡和所有SDXC卡,早期的SDHC卡有可能仍属于V1.0卡命令返回值R7,第一字节为R1,Ver1.0的卡对R1的“非法命令”位2置位,Ver2.0以上卡应返回0x01CMD8rtn = sd_cmd8_version_check(&sdif);if ((rtn&0x04)==0x04) { rtn=sd_v1_process(&sdif);} else { rtn=sd_v2_process(&sdif);}ACMD41和CMD1ACMD41是为卡供电命令,供电前卡的状态为空闲(idle),R1的返回值为0x01,供电后为动作状态(ready)一些早期的卡认为ACMD41是非法命令,只能用MMC的CMD1命令供电ACMD41 Ready if (rtn == 0x01) { while (rtn==0x01) { rtn = sd_send_cond_acmd41_v1(); } } if ((rtn&0x04)==0x04) { // invalid command rtn = 0x01; while (rtn==0x01) { rtn = sd_cmd1_mmc_ready(); } }CMD58CMD58读取卡的状态,一个重要的标志位CCS,会影响到读写操作中地址数据的设定CCS为1时为高版本卡,数据地址为页单位,512字节为一页CCS为0时,地址为以字节为单位实际地址CCS置位与否也取决于ACMD41中对HCS:30bit的置位请求CMD58 CCSrtn = sd_read_ocr_cmd58(sd_inf->rx.r3);sd_inf->ccs = (sd_inf->rx.r3[0]>>6)&0x01;CMD9取得卡容量等信息,CSO寄存器,CSO是16个字节的结构体,加上2字节的CRC,应读取18字节的内容Read CSO sd_cs(0); sd_command(cmd, cc); rtn = sd_response(); if (rtn == 0x00) { if(sd_data_token()==0xFE) { sd_data(cso, 20); } else { rtn = 0xFF; } } sd_cs(1);卡的信息也有版本区别,需要分别处理CSO Version sd_inf->csd_version = (cso[0]>>6)&0x3; if (sd_inf->csd_version==0x0) { sd_inf->block = cso[5]&0xF; sd_inf->unit = cso[6]&0x3; sd_inf->unit <<= 8; sd_inf->unit |= cso[7]; sd_inf->unit <<= 2; sd_inf->unit |= (cso[8]&0xC0)>>6; sd_inf->multi = (cso[9]&0x3); sd_inf->multi <<= 1; sd_inf->multi |= (cso[10]&0x80)>>7; sd_inf->page = sd_inf->unit + 1; sd_inf->page <<= (sd_inf->multi + 2); sd_inf->size = sd_inf->page << sd_inf->block; } else { sd_inf->block = cso[5]&0xF; sd_inf->unit = cso[7]&0x3F; sd_inf->unit <<= 8; sd_inf->unit |= cso[8]; sd_inf->unit <<= 8; sd_inf->unit |= cso[9]; sd_inf->page = sd_inf->unit * 1024; sd_inf->size = sd_inf->page << sd_inf->block; }CMD24 CMD17CMD24写数据CMD17读数据SD的读写都要以页单位进行,无论是否是新版本。老版本的地址设定也要从页的起始处,一般为512的倍数数据块紧接在命令块的后面。数据块长度515个字节,起始标志字节为0xFE,实际数据512字节,2字节CRCCRC使用CRC-16算法,不计算时可以设置为0xFF写操作之后要等待非忙信号,忙信号使MISO为低电位,接收数据一直为0
-
https://bbs.eeworld.com.cn/thread-323249-1-1.html
-
就是f103,普通的板子,板子上面引出一个usb口,让你做串口通讯
我没有f103的板子,建议不保证完全准确板子上有USB口,你想做USB通讯,那是另外的课题你如果用USB->COM的转换器,台式机和STM32需要各自的驱动,做STM32的驱动,那也是另外的课题F103本身支持串口通讯,和USB无关,如果你的板子没有端口,需要自己引线你的描述有自相矛盾的地方,不大理解你的需求究竟是什么
-
具体说说
-
以下是stm32f107的AFIO设置,USART2/3都有7/8线一般开发板上没有联接,自己从GPIO扩展上连出来即可,芯片本身是支持的
不是学习板哦。。就是比较贴近实际应用了
你究竟是用什么硬件
-
PIN 2,3 是数据线,试验中都会用到PIN 7,8 是控制线互连方法可以用Null-Modem我做过缓冲区的例程PIN 7,8的控制器可以去查STM32的参考手册
-
循环缓冲+DMA+传输协议
学习板上一般没有Data Ready引线,也可以考虑用GPIO代替
-
为什么要设成高,不大合规矩嘛设一个外部中断,然后再设另一个脚反向相当于做一个反向器