HPDL1414
是早期计算器和手持编程器上用的ASCII显示管。
之前用它做了块手表,感觉还不错。
图集
可以放在显示器上采用4psc的西门子DL1414,黑色半透明模块,还是很好看的。
蓝牙用的是10mmx10mm的超小型低功耗BLE,使用微信小程序连接下位机BLE。
使用SLA打印外壳,效果还不错,的确挺细腻的。
设计心得
DMA配置串口中断
void USART2_IRQHandler(void)/* 使用串口DMA */
{
u8 num=0;
if(USART_GetITStatus(USART2,USART_IT_IDLE) != RESET)
{
num = USART2->SR;
num = USART2->DR; //清USART_IT_IDLE标志
/* 关闭DMA ,防止干扰 */
DMA_Cmd(DMA1_Channel6, DISABLE);
/* 获取接收到的数据长度 单位为字节*/
num = DMA_Rec_Len - DMA_GetCurrDataCounter(DMA1_Channel6);
receive_data[num] = '\0';
/* 重新赋值计数值,必须大于等于最大可能接收到的数据帧数目 */
DMA1_Channel6->CNDTR = DMA_Rec_Len;
/* 此处应该在处理完数据再打开,如在 DataPack_Process() 打开*/
DMA_Cmd(DMA1_Channel6, ENABLE);
BLE_Flag = 1;
}
/*
DMA 开启,等待数据。注意,如果中断发送数据帧的速率很快,MCU来不及处理此次接收到的数据,
中断又发来数据的话,这里不能开启,否则数据会被覆盖。有2种方式解决:
1. 在重新开启接收DMA通道之前,将Rx_Buf缓冲区里面的数据复制到另外一个数组中,
然后再开启DMA,然后马上处理复制出来的数据。
2. 建立双缓冲,重新配置DMA_MemoryBaseAddr的缓冲区地址,那么下次接收到的数据就会
保存到新的缓冲区中,不至于被覆盖。
*/
}
外部中断与STM32低功耗设计
//中断线0线上的中断检测(低功耗WK_UP)
void EXTI0_IRQHandler(void)
{
if(OPEN_UP == 0 )
key_fall_flag = 1;//生成按键按下标志
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位
}
//中断线1线上的中断检测(水银开关)
void EXTI1_IRQHandler(void)
{
//if(EnGRav)
mod++;
if(mod==5)
mod = 0;
EXTI_ClearITPendingBit(EXTI_Line1); // 清除LINE10上的中断标志位
}
BLE小程序设计
这个demo我github开源)了,具体可以查看:
<view>
<button wx:if="{{!BLEValue}}"
type="primary" class="button" plain="true" size="mini" bindtap="InitBLE">搜 寻 蓝 牙 设 备</button>
<button wx:else
type="primary" class="button" plain="true" size="mini" bindtap="ShutBLE">关 闭 蓝 牙 设 备</button>
<!-- <switch type="checkbox" bindchange="switch0Change" class='connect_state' />-->
<text wx:if="{{ConnectState}}" class="connect_state"> 已 连 接 </text>
<text wx:else class="connect_state"> 未 连 接 </text>
</view>
<!--同步时间-->
<view>
<view class="detail_box">
<!-- <image src='../../images/user-unlogin.png' class="fan"></image> -->
<text class="iconfont fan icon-shandian" style="font-size:40rpx"></text>
<view class='name'>同步当前时间</view>
<switch disabled="{{dis1state}}" checked="{{switch1State}}" bindchange="switch1Change" class='key' />
</view>
</view>
<!--显示字符,按下设备开关切换模式-->
<view>
<view class="detail_box">
<!-- <image src='../../images/user-unlogin.png' class="fan"></image> -->
<text class="iconfont fan icon-shandian" style="font-size:40rpx"></text>
<view class='name'>
<view>显示字符:</view>
<view>\n</view>
<view style="color:red">{{inputValue}}</view>
</view>
<switch disabled="{{dis2state}}" checked="{{switch2State}}" bindchange="switch2Change" class='key' />
</view>
<view class="page-section">
<!-- <view class="weui-cells__title">实时获取输入值</view> -->
<view class="weui-cells weui-cells_after-title">
<view class="weui-cell weui-cell_input">
<input class="weui-input" maxlength="16" bindinput="bindKeyInput" placeholder="[点击此处输入字符]" />
</view>
</view>
</view>
</view>
<!--设置定时开关机时间-->
<view>
<view class="detail_box">
<switch type="checkbox" disabled="{{d_shutdownstate}}" bindchange="useshutdown" class="iconfont fan" />
<picker disabled="{{dis3state}}" mode="time"
value="{{times}}" class="name" start="00:00" end="23:59" bindchange="bindTimeChange">
<view class="picker">点击此处修改开关机时间: {{times}}</view>
</picker>
<switch disabled="{{dis3state}}" checked="{{switch3State}}" bindchange="switch3Change" class='key' />
</view>
</view>
<!--设置备忘录 -->
<view>
<view class="detail_box">
<switch type="checkbox" disabled="{{d_notestate}}" bindchange="usenote" class="iconfont fan" />
<view class='name'>
<view>[备忘录事件:]</view>
<view>\n</view>
<view>
<picker disabled="{{dis3state}}" mode="time"
value="{{times}}" start="00:00" end="23:59" bindchange="bindTimeChange">
<view>{{times}}</view>
</picker>
<input class="name" maxlength="16" bindinput="bindKeyInput" placeholder="[点击此处]" />
</view>
</view>
<switch disabled="{{dis4state}}" checked="{{switch3State}}" bindchange="switch4Change" class='key' />
</view>
</view>
写在最后
这一年STM32T8U6涨的太疯了。。。有空换成ESP32来做吧,还有wifi能用。。
1 条评论
文章结构紧凑,层次分明,逻辑严密,让人一读即懂。