上一篇实现了高精度延时,这一节我们利用已实现的高精度延时接口来模拟串口发生数据(接收数据暂时没用到,所以偷懒没实现),直接上代码。
一、softserial.h
#ifndef _SOFTWARE_SERIAL_H
#define _SOFTWARE_SERIAL_H
#include "stm32f1xx.h"
void soft_serial_init(void);
void serial_write(uint8_t const data);
void serial_transimt(const uint8_t *p_txdata,uint16_t size);
void serial_transmit_str(const uint8_t *str);
#endif
二、softserial.c
#include "softserial.h"
#include "delay.h"
#include "gpio_api.h"
//#include "sf6.h"
#define SER_TX PA_15
#define TX_H() gpio_write(SER_TX,1)
#define TX_L() gpio_write(SER_TX,0)
#define BAUD 9600
const uint16_t bit_dly = 1000000U/BAUD; /* 1s = 1,000,000us */
void soft_serial_init(void)
{
gpio_init(PA_15);
gpio_format(PA_15,GPIO_MODE_OUTPUT_PP,GPIO_PULLUP);
TX_H();
}
void serial_write(uint8_t const data)
{
uint8_t i;
TX_L();
udelay(bit_dly);
for(i=0;i<8;i++){
if((data>>i & 0x01) == 0){
TX_L();
udelay(bit_dly);
}else{
TX_H();
udelay(bit_dly);
}
}
TX_H();
udelay(bit_dly);
}
void serial_transimt(const uint8_t *p_txdata,uint16_t size)
{
for(uint16_t i=0;i
关键字:stm32 模拟串口 高精度延时
引用地址:
stm32模拟串口(基于高精度延时)
推荐阅读最新更新时间:2024-03-16 16:12
STM32:STM32学习记录6: IWDG
配置流程: 1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。 2:IO口初始化,包括引脚,速率,输入输出模式等。 3:初始化看门狗。 注意: 注意如何操作喂狗!!! #include stm32f10x.h #include stm32f10x_iwdg.h #define LED0_OFF GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0关 #define LED0_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0开 //初始化IO端口 void IO_Configuart(void) { GPIO_Ini
[单片机]
STM32 存储器与堆栈问题
首先我们先来看下stm32的系统架构: 可以看出四个驱动单元:D-bus,S-bus,DMA1,DMA2。四个被动单元:SRAM,Flash,FSMC(这块我是以stm32f103zet6来写的,有些32芯片没有这个接口,AHB到APB以及连接的APB设备) 再来看下存储器映射 可以看出flash起始地址为0x0800 0000,SRAM起始地址为0x20000000,外设映射起始地址为0x4000000,再次看到第8块512M的存储器,0xE0000000地址为向量中断控制器的起始地址,查看《crotex-m3权威指南》可以了解到,这个地址在操作系统移植也很重要。 接下来讲BSS段,数据段,代码段,堆,栈 BSS段:(bs
[单片机]
STM32驱动四线I2C的OLED例程
一、原理图 二、程序 main.c ... OLED_Init(); OLED_Clear(); OLED_ShowCHinese(36,0,0);//温 OLED_ShowCHinese(54,0,1);//湿 OLED_ShowCHinese(72,0,2);//度 OLED_ShowString(25,3, T : ,16); OLED_ShowString(25,5, H : ,16); OLED_ShowCHinese(80,3,3);//℃ OLED_ShowString(80,5, % ,16); ... oled.c #i
[单片机]
STM32 EXTI外部中断
外部中断引脚配置初始化:以PA0为例说明 1、外设端口时钟打开 RCC- APB2ENR|=1 2; //使能PORTA时钟 2、端口设置为输入 GPIOA- CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA- CRL|=0X00000008; 3、端口选择上拉/下拉方式 GPIOA- ODR&=0xFFFFFFFE; //A0默认下拉 4、中断触发方式选择 Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 5、嵌套向量中断控制(抢占优先级,响应优先级,组) MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
[单片机]
基于STM32的USB枚举过程学习笔记(四)
前几篇介绍中,USB主机完成了获取设备的描述符,现在进入第二步,设置设备的地址阶段。 该阶段是一个无数据过程的控制传输。首先,在建立过程中USB主机往设备的端点0发出一个设置地址的请求,新地址在建立过程的数据包中。该事务的结构包括:SETUP0令牌包+SET_ADDRESS数据包+握手包。在建立过程之后直接进入到的状态过程,因为设置地址阶段是一个无数据过程的控制传输。在状态过程,设备等待主机请求状态返回(即等待主机发送一个IN令牌包),收到IN令牌包后,设备就返回一个0长度的数据包,如果主机确认该数据包已经正确收到,就会发送应答包ACK给设备,设备收到ACK之后,就要启动新的设备地址,这样设备就分配到了一个唯一的设备地址。
[单片机]
通过BUG来理解STM32的HSE时钟
前言:最近在搞GPRS的时候,遇到了这么一个问题,所使用的单片机为STM32F103RBT6,刚开始先写了个串口打印的程序,波特率设置为19200,可是在上位机上输出的信息总是乱码,检查了好几遍的代码,硬件等等就是没找到问题。于是就在上位机上对波特率从115200往下一个一个的试,终于,当波特率设置为38400的时候,打印信息正确,额滴歌神啊,这是什么情况呢,我在程序中明明设置的波特率为19200,为什么上位机上波特率为19200的时候不对,而为38400的时候输出正确呢?于是,又回过头来检查电路原理图和代码,Oh,My god,原来问题在这里,因此这篇博客将以我遇到的问题为起点,对STM32的HSE时钟做一个总结。 一、
[单片机]
如何为STM32编程节省代码空间?在IAR中配置CRC参数有窍门
前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在IEC60335中,也接受通过CRC校验对FLASH的完整性进行检查。在对FLASH完整性检查的应用中,需要事先计算出整个FLASH的CRC校验值(不包括最后保存CRC值的字节),放在FLASH的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个FLASH的CRC校验值,然后与保存在FLASH末尾的CRC值进行比较。 EWARM从v5.5版本之后开始支持STM32芯片的CRC计算。前面所说的计算整个FLASH的CRC校验值并保存在FLASH末
[单片机]
STM32 SysTick定时器讲解
STM32 SysTick定时器讲解 本文将介绍SysTick定时器、其工作原理与寄存器、及对应的应用实例 SysTick定时器简介 首先、我们先解释下定时器,“定时器”:能够定时、计数的器件 SysTick称为系统滴答定时器,它位于Cortex 内核中是一个定时器,可以对输入的时钟进行计数、若输入的时钟具有周期性的变化,则计数也相当于计时。 系统滴答定时器一般用于操作系统,为操作系统提供时基、维持操作系统的心跳; 系统滴答定时器每过一段时间会产生一个中断,根据这个特性、操作系统就可以实现时间片的任务调度。 工作原理分析 从上述两张图我们可以看出: 系统滴答定时器的时钟源是从SYSCLK处经过分频得到的,另外它处于内核中
[单片机]