收藏0 举报
#include "io2uart.h" #include "stdio.h" #include "string.h" unsigned char bbb; #define RXD_IN (GPIO_PIN_4) //RXD PD4 #define TXD_OUT (GPIO_PIN_3) //TXD PD3 void IOInit(void) { GPIO_Init(GPIOD, RXD_IN, GPIO_MODE_IN_PU_NO_IT); GPIOD->DDR |= TXD_OUT;//输出模式 GPIOD->CR1 |= TXD_OUT;//推挽输出 GPIO_Init(GPIOD,TXD_OUT,GPIO_MODE_OUT_PP_HIGH_FAST); } void Delay_us(unsigned int nCount) { for (; nCount != 0; nCount--); } void SEND_1(void) { GPIOD->ODR |=0x08; //PD3=1,TXD } void SEND_0(void) { GPIOD->ODR &=0xFE; //PD3=0,TXD } void WriteByte(unsigned char sdata) //波特率4800 { unsigned char i; unsigned char value=0; static int xxx = 550; //发送起始位 SEND_0(); Delay_us(xxx);//45 //发送数据位 for(i=0;i<8;i++) { value=(sdata&0x01); //先传低位 if(value) { SEND_1(); } else { SEND_0(); } Delay_us(xxx);//40 sdata=sdata>>1; } //停止位 SEND_1(); Delay_us(xxx); //50 } unsigned char ReadByte(void) { unsigned char i,value=0; while(1) { if(!(GPIO_ReadInputData(GPIOD)&0x10)) //RXD_IN { //等过起始位 Delay_us(550); //接收8位数据位 for(i=0;i<8;i++) { value>>=1; if((GPIO_ReadInputData(GPIOD)&0x10)) //RXD_IN { value|=0x80; } Delay_us(550); } Delay_us(550); return value; } } } unsigned char ReadAndWrite(unsigned char *RBuf) { GPIOD->ODR |= RXD_IN; RBuf[0]=ReadByte(); WriteByte(RBuf[0]); return 1; } void main( void ) { IOInit(); __enable_interrupt(); while(1) { ccc=ReadAndWrite(ReadBuf); } } 目前实现了使用延时能够接收、发送数据,可是一直调用ReadAndWrite(ReadBuf); 是不行的,求个使用中断、下降沿来触发
毁灭2012 发表于 2015-12-17 16:41 void SEND_1(void) { GPIOD->ODR |=0x08; //PD3=1,TXD } ,,这个不是很懂,请教!!! ...
布丁奶茶 发表于 2015-12-18 13:26 楼主的问题解决了吗
笨笨笨笨小孩 发表于 2015-12-18 14:11 还没有,有方案吗
布丁奶茶 发表于 2015-12-18 15:07 我用你的程序,用串口助手仿真,完全没反应啊。。。 不过你要用中断的话,在中断处理函数里调用你的ReadA ...
笨笨笨笨小孩 发表于 2015-12-18 15:51 波特率是4800哦,用串口调试时接收发送数据是没有问题的哦,用中断试了下,在中断中挂了 ...
stm8s_it.c文件 INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { ReadAndWrite(ReadBuf); } main.c文件 #define VM_UART_TXD_PORT_IN GPIOD->DDR &= ~(GPIO_PIN_4);GPIOD->CR1 |= (GPIO_PIN_4);GPIOD->CR2 &= (~GPIO_PIN_4) //设定为输出 #define VM_UART_RXD_PORT_INT_IN GPIOD->DDR &= ~(GPIO_PIN_3);GPIOD->CR1 |= (GPIO_PIN_3);GPIOD->CR2 |= (GPIO_PIN_3) //只上拉输入 不中断 //设置为可中断输入 void GPIO_init(void) { EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PDIS); EXTI->CR1 |= (uint8_t)(0x80);//下降沿触发 VM_UART_TXD_PORT_IN; VM_UART_RXD_PORT_INT_IN; } void main( void ) { IOInit(); GPIO_init(); __enable_interrupt(); while(1) { } } 使用外部中断,下降沿触发中断,接收数据(其他代码不变)
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
发帖类勋章
等级类勋章
1
8
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号